按 groupby 平均值填充 PySpark 数据框列的空值

Fill PySpark dataframe column's null values by groupby mean

我有一个包含以下两列的大型 PySpark 数据框:

highway speed_kph
Road 70
Service 30
Road null
Road 70
Service null

我想用 highway 类别的平均值填充 null 值。

我尝试使用 groupBy 创建另一个数据框,最后得到了第二个数据框:

highway avg(speed_kph)
Road 65
Service 30

但我不知道如何使用它来仅填充 null 值,并且如果它们存在则不会丢失原始值。

第一个 table 的预期结果是:

highway speed_kph
Road 70
Service 30
Road 65
Road 70
Service 30

case when 和 window 函数的组合 highway 将很容易解决它。

from pyspark.sql import functions as F
from pyspark.sql import Window as W

(df
    .withColumn('speed_kph', F
        .when(F.col('speed_kph').isNull(), F.mean('speed_kph').over(W.partitionBy('highway')))
        .otherwise(F.col('speed_kph'))
    )
    .show()
)

# Output
# +-------+---------+
# |highway|speed_kph|
# +-------+---------+
# |   Road|     70.0|
# |   Road|     70.0|
# |   Road|     70.0|
# |Service|     30.0|
# |Service|     30.0|
# +-------+---------+