Python 如何使用PySpark使用组的聚合填充空值

Python 如何使用PySpark使用组的聚合填充空值,python,apache-spark,pyspark,azure-databricks,Python,Apache Spark,Pyspark,Azure Databricks,我有一个带有一些空值的简单数据集: Age,Title 10,Mr 20,Mr null,Mr 1, Miss 2, Miss null, Miss 我想用不同列(在本例中为Title)的分组聚合来填充null值。例如,标题栏的平均值为: 15, Mr 1.5, Miss 所以最终结果应该是这样的: Age,Title 10,Mr 20,Mr 15,Mr 1, Miss 2, Miss 1.5, Miss meanAgeDf = df.groupBy("Title").mean("Age"

我有一个带有一些空值的简单数据集:

Age,Title
10,Mr
20,Mr
null,Mr
1, Miss
2, Miss
null, Miss
我想用不同列(在本例中为Title)的分组聚合来填充null值。例如,标题栏的平均值为:

15, Mr
1.5, Miss
所以最终结果应该是这样的:

Age,Title
10,Mr
20,Mr
15,Mr
1, Miss
2, Miss
1.5, Miss
meanAgeDf = df.groupBy("Title").mean("Age").select("Title", col("avg(Age)").alias("AgeMean"))
我已经看到很多使用熊猫的例子使用变换

df["Age"] = df.groupby("Title").transform(lambda x: x.fillna(x.mean()))
我尽量不使用外部库,而是在pyspark中以本机方式使用。python数据帧没有转换方法

我正在考虑将聚合存储在一个单独的数据帧中,如下所示:

Age,Title
10,Mr
20,Mr
15,Mr
1, Miss
2, Miss
1.5, Miss
meanAgeDf = df.groupBy("Title").mean("Age").select("Title", col("avg(Age)").alias("AgeMean"))
然后对每个分组查找标题,并用该平均值填充所有这些值:

from pyspark.sql.functions import when, col
x = df.join(meanAgeDf, "Title").withColumn("AgeMean", when(col("Age").isNull(), col("AgeMean")).otherwise(col("Age")))

这是最有效的方法吗?

这可以使用窗口功能
avg
一步完成

from pyspark.sql import Window
from pyspark.sql import when,avg
w = Window.partitionBy(df.title)
res = df.withColumn("mean_col",avg(df.age).over(w))

谢谢,太棒了!现在我如何做同样的事情,但中位数?似乎没有中位数窗口函数,并且带有近似分位数的UDF不起作用。您可能可以使用
百分比_秩