如何在保持其他列的同时grouby列并查找max?

时间:2018-07-26 04:14:02

标签: python scala apache-spark pyspark

如何在保留第三列的同时按列分组并找到最大值? 我想找到每个名称的最高分,但我也想保留具有最高分的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

我认为我需要使用joinagg,但不确定。

2 个答案:

答案 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)

我希望答案会有所帮助