如何从pyspark中2列中部分匹配的行中随机选择1行

kkih6yb8  于 2021-07-12  发布在  Spark
关注(0)|答案(2)|浏览(233)

我正在使用PySpark3.0.1。我有一个学生数据框 df . Dataframe看起来像

MathsMarks HistoryMarks id   class   TotalMarks
  80          75         1     9        300
  90          78         1     9        350
  65          70         7     8        250
  58          55         7     8        200
  75          72         7     8        260
  85          82         9     9        400
  82          85         15    8        410

我需要从数据中随机选择一个记录,如果 id & class 组合重复多次。例如,我的结果可能是

MathsMarks HistoryMarks id   class   TotalMarks
  80          75         1     9        300
  58          55         7     8        200
  85          82         9     9        400
  82          85         15    8        410

你能建议我怎么做吗?在实现@mck的步骤之后,当它们不在连续的行中时,我得到了重复的结果。例如

Group MathsMarks HistoryMarks id   class   TotalMarks
   A      80          75         1     9        300
   A      90          78         1     null     350
   A      70          78         1     9        320

   B      65          70         7     8        250
   B      58          55         8     null     240
   B      65          70         7     8        250
   B      58          55         8     null     200
   C      85          82         9     9        400
   D      82          85         15    8        410

我想把这个放在下面

Group MathsMarks HistoryMarks id   class   TotalMarks
   A      80          75         1     9        300
   A      90          78         1     null     350

   B      65          70         7     8        250
   B      58          55         8     null     240
   C      85          82         9     9        400
   D      82          85         15    8        410
jslywgbw

jslywgbw1#

你可以用 row_number() :

from pyspark.sql import functions as F, Window

df1 = df.withColumn(
    "rn", 
    F.row_number().over(Window.partitionBy("id", "class").orderBy(F.lit(None)))
).filter("rn = 1").drop("rn")

df1.show()

# +----------+------------+---+-----+----------+

# |MathsMarks|HistoryMarks| id|class|TotalMarks|

# +----------+------------+---+-----+----------+

# |        65|          70|  7|    8|       250|

# |        82|          85| 15|    8|       410|

# |        85|          82|  9|    9|       400|

# |        80|          75|  1|    9|       300|

# +----------+------------+---+-----+----------+
evrscar2

evrscar22#

一个简单的 dropDuplicates 将完成以下工作:

df.dropDuplicates(['id', 'class']).show()
+----------+------------+---+-----+----------+
|MathsMarks|HistoryMarks| id|class|TotalMarks|
+----------+------------+---+-----+----------+
|        82|          85| 15|    8|       410|
|        85|          82|  9|    9|       400|
|        80|          75|  1|    9|       300|
|        65|          70|  7|    8|       250|
+----------+------------+---+-----+----------+

相关问题