使用Pandas,当另一列上的Group By具有另一列的Max Value时,查找列的值,在PySpark DataFrame中

3ks5zfa0  于 2023-06-28  发布在  Spark
关注(0)|答案(1)|浏览(224)

pandas groupby where you get the max of one column and the min of another column类似,假设 Dataframe 是关于赛车的,我们在df中有以下[Race_Event_ID,Car_ID,Driver_ID,AvgSpeed] Group By df.group_by(['Race_Event_ID'])['Speed'].agg(['max','mean',.....]可以给出Group by Stats。但我需要有'Speed' , Car_ID, Driver_ID的Topper,或谁的speed = 'Max Speed',同样的裁缝的速度,Car_ID,Driver_ID,即速度=最小速度。
考虑到可能有平局与最高速度,让我们得到两者或至少一个。
一种解决方案是,

df_max =df.group_by(['Race_Event_ID'])['Speed'].agg(['max'])

df_max.merge(df,on='Race_Event_ID')

这个解决方案可能需要时间。在数据的相同迭代中,如果我们自己迭代,事情可能是可以实现的。我们有没有一个有效的方法在Pandas?我也很想看到Spark DataFrame解决方案。

bkkx9g8r

bkkx9g8r1#

如果你不使用合并,你可以尝试Windows:

from pyspark.sql import SparkSession
from pyspark.sql.functions import max as spark_max, min as spark_min
from pyspark.sql.window import Window

spark = SparkSession.builder.getOrCreate()

window = Window.partitionBy('Race_Event_ID')

df = df.withColumn('Max_Speed', spark_max('Speed').over(window))
df = df.withColumn('Min_Speed', spark_min('Speed').over(window))

topper = df.filter(df['Speed'] == df['Max_Speed'])
tailer = df.filter(df['Speed'] == df['Min_Speed'])

topper_info = topper.select('Race_Event_ID', 'Car_ID', 'Driver_ID', 'Speed')
tailer_info = tailer.select('Race_Event_ID', 'Car_ID', 'Driver_ID', 'Speed')

相关问题