Pyspark 如何在“groupBy()”之后选择数据帧的特定行?
我有一个pyspark数据帧:Pyspark 如何在“groupBy()”之后选择数据帧的特定行?,pyspark,pyspark-dataframes,Pyspark,Pyspark Dataframes,我有一个pyspark数据帧:df。例如: e | attempt | grade --------------------- 1 | 1 | 100 2 | 1 | 95 2 | 2 | 55 3 | 1 | 78 3 | 2 | 100 3 | 3 | 88 . . . 我只想为“e”的每个值选择一行: 在具有相同“e”值的所有其他行中,具有最大“尝试”值且其尝试小于X的行 例如,如果我调用get_re
df
。例如:
e | attempt | grade
---------------------
1 | 1 | 100
2 | 1 | 95
2 | 2 | 55
3 | 1 | 78
3 | 2 | 100
3 | 3 | 88
.
.
.
我只想为“e”的每个值选择一行:
在具有相同“e”值的所有其他行中,具有最大“尝试”值且其尝试小于X的行
例如,如果我调用get_results(3)
e | attempt | grade
---------------------
1 | 1 | 100
2 | 2 | 55
3 | 3 | 88
.
.
.
e | attempt | grade
---------------------
1 | 1 | 100
2 | 2 | 55
3 | 2 | 100
.
.
.
e | attempt | grade
---------------------
1 | 1 | 100
2 | 1 | 95
3 | 1 | 78
.
.
.
如果我调用get_results(2)
e | attempt | grade
---------------------
1 | 1 | 100
2 | 2 | 55
3 | 3 | 88
.
.
.
e | attempt | grade
---------------------
1 | 1 | 100
2 | 2 | 55
3 | 2 | 100
.
.
.
e | attempt | grade
---------------------
1 | 1 | 100
2 | 1 | 95
3 | 1 | 78
.
.
.
如果我调用get_results(1)
e | attempt | grade
---------------------
1 | 1 | 100
2 | 2 | 55
3 | 3 | 88
.
.
.
e | attempt | grade
---------------------
1 | 1 | 100
2 | 2 | 55
3 | 2 | 100
.
.
.
e | attempt | grade
---------------------
1 | 1 | 100
2 | 1 | 95
3 | 1 | 78
.
.
.
我想我应该从
df.groupby('e')
开始,但我不知道如何从那里继续。这个想法是首先以列e
和尝试
(降序)顺序排列数据帧。完成后,我们选择最上面一行
# Loading the requisite packages and creating the DataFrame.
from pyspark.sql.window import Window
from pyspark.sql.functions import col, first, row_number
valuesCol = [(1,1,100),(2,1,95),(2,2,55),(3,1,78),(3,2,100),(3,3,88)]
df = spark.createDataFrame(valuesCol,['e','attempt','grade'])
df.show()
+---+-------+-----+
| e|attempt|grade|
+---+-------+-----+
| 1| 1| 100|
| 2| 1| 95|
| 2| 2| 55|
| 3| 1| 78|
| 3| 2| 100|
| 3| 3| 88|
+---+-------+-----+
现在,我们选择一个值X
。正如OP所说,trunt
的值不能大于X
,因此我们过滤掉trunt
大于X
的所有行,然后使用函数排序
X=2
w = Window.partitionBy(col('e')).orderBy(col('attempt').desc())
df = df.where(col('attempt')<=X).orderBy(['e','attempt'], ascending=[1,0])
df.show()
+---+-------+-----+
| e|attempt|grade|
+---+-------+-----+
| 1| 1| 100|
| 2| 2| 55|
| 2| 1| 95|
| 3| 2| 100|
| 3| 1| 78|
+---+-------+-----+
这里的
X
是什么?@cph\u sto这是get\u results(X)