如何在保留第三列的同时按列分组并找到最大值? 我想找到每个名称的最高分,但我也想保留具有最高分的ID。
这是我当前拥有的数据帧df1:
score name id
1.9 n1 34
0.1 n1 56
3.5 n1 77
1.2 n2 45
3.9 n3 454
3.0 n1 123
1.2 n2 1
4.2 n3 34
4.0 n3 3
df2:
max(score) name
3.5 n1
1.2 n2
4.2 n3
这就是我想要的df3:
max(score) name id
3.5 n1 77
1.2 n2 1
1.2 n2 45
4.2 n3 34
我认为我需要使用join
或agg
,但不确定。
答案 0 :(得分:3)
您可以使用窗口功能来实现此目的。
from pyspark.sql.window import Window
from pyspark.sql.functions import dense_rank, desc, col
df1.withColumn('rank', dense_rank().over(Window.partitionBy('name').orderBy(desc('score')))) \
.where(col('rank')==1) \
.drop('rank') \
.show()
答案 1 :(得分:1)
我认为我需要使用.join或.agg,但不确定。
方法如下:
首先是分组和聚集
padding: 0em 0 !important
然后使用别名
加入from pyspark.sql.functions import max
df2 = df1.groupBy('name').agg(max('score').alias('score'))
应该为您提供所需的输出
df2.join(df1.alias('df1'), ['score', 'name'], 'left')\
.select(df2.score.alias('max(score)'), df2.name, 'df1.id')\
.show(truncate=False)
我希望答案会有所帮助