如何在PYSPARK中用平均值替代空值?

时间:2019-07-25 07:36:53

标签: python apache-spark pyspark apache-spark-sql

如何用平均值替换col1列中的空值?但是,存在以下情况:

id   col1
1    12
1    NaN
1    14
1    10
2    22
2    20
2    NaN
3    NaN
3    NaN

id=1的NaN值应替换为col1上计算的id=1的平均值12((12 + 14 + 10)/ 3) )。 id=2也是如此。 id=3之类的情况可以忽略,而NaN可以保留。

这是我尝试过的:

calcul = df.groupby("id").agg(func.mean("col1"))

df = df.withColumn("col1", func.when((df["col1"].isNull()), calcul.where(func.col("id")==df["id"])).otherwise(func.col("col1")))

请删除PANDAS的重复标签。我使用PYSPARK。

2 个答案:

答案 0 :(得分:1)

首先从原始数据帧中删除null,然后按id分组,然后取平均值:

df_ave = df1.dropna().groupby('id').agg(F.mean('col1').alias('mean'))
df_ave.show()

输出:

+---+----+
| id|mean|
+---+----+
|  1|12.0|
|  2|21.0|
+---+----+

然后将其与原始数据框结合起来

df1 = df1.join(df_ave, on='id', how='left')
df1.show()

输出:

+---+----+----+
| id|col1|mean|
+---+----+----+
|  1|12.0|12.0|
|  1| NaN|12.0|
|  1|14.0|12.0|
|  1|10.0|12.0|
|  3| NaN|null|
|  3| NaN|null|
|  2|22.0|21.0|
|  2|20.0|21.0|
|  2| NaN|21.0|
+---+----+----+

然后使用以下when语句并创建新列col1_new

df1 = df1.withColumn('col1_new', F.when( df1.col1=='NaN', df1.mean).otherwise(df1.col1))
df1.show()

输出:

+---+----+----+--------+
| id|col1|mean|col1_new|
+---+----+----+--------+
|  1|12.0|12.0|    12.0|
|  1| NaN|12.0|    12.0|
|  1|14.0|12.0|    14.0|
|  1|10.0|12.0|    10.0|
|  3| NaN|null|    null|
|  3| NaN|null|    null|
|  2|22.0|21.0|    22.0|
|  2|20.0|21.0|    20.0|
|  2| NaN|21.0|    21.0|
+---+----+----+--------+

您还可以删除不需要的列,并将col1_new重命名为col1

df1 = df1.select('id', 'col1_new').withColumnRenamed('col1_new', 'col1')
df1.show()

输出:

+---+----+
| id|col1|
+---+----+
|  1|12.0|
|  1|12.0|
|  1|14.0|
|  1|10.0|
|  3|null|
|  3|null|
|  2|22.0|
|  2|20.0|
|  2|21.0|
+---+----+

答案 1 :(得分:0)

使用联接效率很低。

我建议将Windowpyspark.sql.functions.mean一起使用:

class Program
{

    static void Main(string[] args)
    {
        GetQuery<ITESTEntity>();
    }

    static void GetQuery<I>() where I : IEntityBase
    {
        var qry = new myQuery<TESTEntity, I>();
    }
}

class myQuery<T, I> 
    where T : class, I
    where I : IEntityBase
{

}