【问题标题】:How to fill null values with a aggregate of a group using PySpark如何使用 PySpark 用组的聚合填充空值
【发布时间】:2019-04-24 23:44:39
【问题描述】:

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

Age,Title
10,Mr
20,Mr
null,Mr
1, Miss
2, Miss
null, Miss

我想用不同列(在本例中为标题)的分组聚合填充空值。例如。标题列的平均值是:

15, Mr
1.5, Miss

所以最终的结果应该是这样的:

Age,Title
10,Mr
20,Mr
15,Mr
1, Miss
2, Miss
1.5, Miss

我已经看到很多使用 Pandas 使用 Transform 的示例:

df["Age"] = df.groupby("Title").transform(lambda x: x.fillna(x.mean()))

我试图不使用外部库,而是在 pyspark 中本地进行。 python数据框没有transform方法。

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

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")))

这是最有效的方法吗?

【问题讨论】:

    标签: python apache-spark pyspark


    【解决方案1】:

    这可以使用窗口函数avg一步完成。

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

    【讨论】:

    • 谢谢,太棒了!现在......我将如何做同样的事情,但使用中位数?似乎没有中值窗口函数,并且带有 approxQuantile 的 UDF 不起作用
    • 你大概可以使用percent_rank?
    猜你喜欢
    • 2017-10-29
    • 2021-04-24
    • 2022-12-10
    • 2021-11-16
    • 2020-04-18
    • 1970-01-01
    • 2020-11-29
    • 2020-12-09
    • 1970-01-01
    相关资源
    最近更新 更多