[英]Filling pyspark dataframe null values
我有一個 pyspark dataframe 它有 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 中所有其他非缺失值的平均值
例如,給定上面的 dataframe,只有前兩行的 col2、col3、col4 值與第 3 行相同。因此,第 3 行的 col1 中的 null 值應替換為第 1 行和第 2 行中 col1 值的平均值。對於第 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|
+----+----+----+----+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.