在不加入 PySpark 的情况下将组的方法添加回大数据框

Adding the means of groups back to big dataframe without join in PySpark

我有这段代码:

shifted_pd = account_level_pd_shifts.filter(account_level_pd_shifts['WITHIN_PD_EXCLUSION'] == True).groupBy(['FORWARD_LOOK_MODEL', 'FOR_PD_TYPE']).agg(f.avg('PD_SHIFT').alias('SHIFTED_PD'))

account_level_pd_shifts = account_level_pd_shifts.drop('SHIFTED_PD').join(f.broadcast(shifted_pd), on=['FORWARD_LOOK_MODEL', 'FOR_PD_TYPE'], how='left')

我不能做groupby的平均值,只取第一个值然后用f.lit()将它添加到一个新列因为分组数据有4个项目,它不是1意味着我得到,我得到 4 个方法。

这两行代码在23个循环迭代中,23个连接不是很好。 有没有办法避免这种情况,并以某种方式直接添加每个组的方法,或者不连接回大数据框?

如果不清楚,我可以提供额外的信息:)

感谢帮助

您正在寻找的是窗口函数。您想计算 Window 的条件平均值:

from pyspark.sql import Window
from pyspark.sql.functions import col, when, avg


w = Window.partitionBy('FORWARD_LOOK_MODEL', 'FOR_PD_TYPE')
account_level_pd_shifts = account_level_pd_shifts.withColumn("SHIFTED_PD",
                                                              avg(when(col("WITHIN_PD_EXCLUSION"),
                                                                       col("PD_SHIFT")
                                                                   )
                                                              ).over(w)
                                                          )