如何用平均值替换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。
答案 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)
使用联接效率很低。
我建议将Window与pyspark.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
{
}