按 groupby 平均值填充 PySpark 数据框列的空值
Fill PySpark dataframe column's null values by groupby mean
我有一个包含以下两列的大型 PySpark 数据框:
highway
speed_kph
Road
70
Service
30
Road
null
Road
70
Service
null
我想用 highway
类别的平均值填充 null
值。
我尝试使用 groupBy 创建另一个数据框,最后得到了第二个数据框:
highway
avg(speed_kph)
Road
65
Service
30
但我不知道如何使用它来仅填充 null
值,并且如果它们存在则不会丢失原始值。
第一个 table 的预期结果是:
highway
speed_kph
Road
70
Service
30
Road
65
Road
70
Service
30
case
when
和 window 函数的组合 highway
将很容易解决它。
from pyspark.sql import functions as F
from pyspark.sql import Window as W
(df
.withColumn('speed_kph', F
.when(F.col('speed_kph').isNull(), F.mean('speed_kph').over(W.partitionBy('highway')))
.otherwise(F.col('speed_kph'))
)
.show()
)
# Output
# +-------+---------+
# |highway|speed_kph|
# +-------+---------+
# | Road| 70.0|
# | Road| 70.0|
# | Road| 70.0|
# |Service| 30.0|
# |Service| 30.0|
# +-------+---------+
我有一个包含以下两列的大型 PySpark 数据框:
highway | speed_kph |
---|---|
Road | 70 |
Service | 30 |
Road | null |
Road | 70 |
Service | null |
我想用 highway
类别的平均值填充 null
值。
我尝试使用 groupBy 创建另一个数据框,最后得到了第二个数据框:
highway | avg(speed_kph) |
---|---|
Road | 65 |
Service | 30 |
但我不知道如何使用它来仅填充 null
值,并且如果它们存在则不会丢失原始值。
第一个 table 的预期结果是:
highway | speed_kph |
---|---|
Road | 70 |
Service | 30 |
Road | 65 |
Road | 70 |
Service | 30 |
case
when
和 window 函数的组合 highway
将很容易解决它。
from pyspark.sql import functions as F
from pyspark.sql import Window as W
(df
.withColumn('speed_kph', F
.when(F.col('speed_kph').isNull(), F.mean('speed_kph').over(W.partitionBy('highway')))
.otherwise(F.col('speed_kph'))
)
.show()
)
# Output
# +-------+---------+
# |highway|speed_kph|
# +-------+---------+
# | Road| 70.0|
# | Road| 70.0|
# | Road| 70.0|
# |Service| 30.0|
# |Service| 30.0|
# +-------+---------+