正在填充pyspark数据帧null值



我有一个pyspark数据帧,它有4列。

+-----+-----+-----+-----+
|col1 |col2 |col3 |col4 |
+-----+-----+-----+-----+
|10   | 5.0 | 5.0 | 5.0 |
|20   | 5.0 | 5.0 | 5.0 |
|null | 5.0 | 5.0 | 5.0 |
|30   | 5.0 | 5.0 | 6.0 |
|40   | 5.0 | 5.0 | 7.0 |
|null | 5.0 | 5.0 | 8.0 |
|50   | 5.0 | 6.0 | 9.0 |
|60   | 5.0 | 7.0 | 10.0|
|null | 5.0 | 8.0 | 11.0|
|70   | 6.0 | 9.0 | 12.0|
|80   | 7.0 | 10.0| 13.0|
|null | 8.0 | 11.0| 14.0|
+-----+-----+-----+-----+

col1中的一些值丢失了,我想根据以下方法设置这些丢失的值:

尝试根据具有相同col2、col3、col4值的记录的col1值的平均值来设置它

如果没有这样的记录,则根据具有相同col2、col3值的记录的col1值的平均值设置

如果仍然没有这样的记录,则根据具有相同col2值的记录的col1值的平均值设置

如果以上都找不到,请将其设置为col1 中所有其他未丢失值的平均值

例如,给定上面的数据帧,只有前两行具有与第3行相同的col2、col3、col4值。因此,第3行的col1中的null值应该替换为第1行和第2行的coll值的平均值。对于第6行col1中的null值,它将是第4行和第5行col1值的平均值,因为只有那些行具有与第6行相同的col2和col3值,而不是相同的col4值。名单还在继续…

+-----+-----+-----+-----+
|col1 |col2 |col3 |col4 |
+-----+-----+-----+-----+
|10   | 5.0 | 5.0 | 5.0 |
|20   | 5.0 | 5.0 | 5.0 |
|15   | 5.0 | 5.0 | 5.0 |
|30   | 5.0 | 5.0 | 6.0 |
|40   | 5.0 | 5.0 | 7.0 |
|25   | 5.0 | 5.0 | 8.0 |
|50   | 5.0 | 6.0 | 9.0 |
|60   | 5.0 | 7.0 | 10.0|
|35   | 5.0 | 8.0 | 11.0|
|70   | 6.0 | 9.0 | 12.0|
|80   | 7.0 | 10.0| 13.0|
|45   | 8.0 | 11.0| 14.0|
+-----+-----+-----+-----+

最好的方法是什么?

我找不到与您完全相同的值,但根据您所说的,代码如下:

from pyspark.sql import functions as F
df_2_3_4 = df.groupBy("col2", "col3", "col4").agg(
F.avg("col1").alias("avg_col1_by_2_3_4")
)
df_2_3 = df.groupBy("col2", "col3").agg(F.avg("col1").alias("avg_col1_by_2_3"))
df_2 = df.groupBy("col2").agg(F.avg("col1").alias("avg_col1_by_2"))
avg_value = df.groupBy().agg(F.avg("col1").alias("avg_col1")).first().avg_col1

df_out = (
df.join(df_2_3_4, how="left", on=["col2", "col3", "col4"])
.join(df_2_3, how="left", on=["col2", "col3"])
.join(df_2, how="left", on=["col2"])
)
df_out.select(
F.coalesce(
F.col("col1"),
F.col("avg_col1_by_2_3_4"),
F.col("avg_col1_by_2_3"),
F.col("avg_col1_by_2"),
F.lit(avg_value),
).alias("col1"),
"col2",
"col3",
"col4",
).show()
+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
|10.0| 5.0| 5.0| 5.0|
|15.0| 5.0| 5.0| 5.0|
|20.0| 5.0| 5.0| 5.0|
|30.0| 5.0| 5.0| 6.0|
|40.0| 5.0| 5.0| 7.0|
|25.0| 5.0| 5.0| 8.0|
|50.0| 5.0| 6.0| 9.0|
|60.0| 5.0| 7.0|10.0|
|35.0| 5.0| 8.0|11.0|
|70.0| 6.0| 9.0|12.0|
|80.0| 7.0|10.0|13.0|
|45.0| 8.0|11.0|14.0|
+----+----+----+----+

最新更新