Pyspark 如何在“groupBy()”之后选择数据帧的特定行?

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

我有一个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_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)