具有来自另一个数据框的值的 Pyspark fillna

Pyspark fillna with value from another dataframe

所以我要做的是用每个商店组的平均收入填充数据框上收入列的空值。

原始数据框:

df = spark.createDataFrame(
[
  ('Store 1', 1, 448),
  ('Store 1', 2, None),
  ('Store 1', 3, 499),
  ('Store 1', 44, 432),
   (None,None,None),
  ('Store 2', 1, 355),
  ('Store 2', 1, 355),
  ('Store 2', None, 345),
  ('Store 2', 3, 387),
  ('Store 2', 4, 312),
  ('Store 2', None, 555),
  (None, 10, None)
],
   ['Store', 'WeekInMonth', 'Revenue']
)

我已经从原始数据帧创建了第二个数据帧,除了这个我只是想获得每个数据帧的方法

df2 = df.groupBy('Store').avg('Revenue')
df2 = df2.select("Store", col("avg(Revenue)").alias("Revenue")).where("Store = 'Store 2' or Store = 'Store 1'")
display(df2)

我想做的是用每个商店 df2 的平均值填充第一个数据帧上的 Null 值。

要用每家商店的平均收入替换空值,请使用 window 函数。

df.show()
+-------+-----------+-------+                                                   
|  Store|WeekInMonth|Revenue|
+-------+-----------+-------+
|Store 1|          1|    448|
|Store 1|          2|   null|
|Store 1|          3|    499|
|Store 1|         44|    432|
|Store 2|       null|    345|
|Store 2|       null|    555|
|Store 2|          1|    355|
|Store 2|          1|    355|
|Store 2|          3|    387|
|Store 2|          4|    312|
|   null|       null|   null|
|   null|         10|   null|
+-------+-----------+-------+

计算每个 window 的平均值,并在 null.

时将 revenue 替换为 mean
from pyspark.sql.functions import *
from pyspark.sql.window import Window
from pyspark.sql import functions as F

w=Window().partitionBy("Store")

df.withColumn("mean", F.mean("Revenue").over(w))\
    .withColumn("Revenue", F.when(col("Revenue").isNull(), col("mean"))\
    .otherwise(col("Revenue"))).drop("mean").show()

+-------+-----------+-----------------+                                         
|  Store|WeekInMonth|          Revenue|
+-------+-----------+-----------------+
|Store 1|          1|            448.0|
|Store 1|          2|459.6666666666667|
|Store 1|          3|            499.0|
|Store 1|         44|            432.0|
|Store 2|       null|            345.0|
|Store 2|       null|            555.0|
|Store 2|          1|            355.0|
|Store 2|          1|            355.0|
|Store 2|          3|            387.0|
|Store 2|          4|            312.0|
|   null|       null|             null|
|   null|         10|             null|
+-------+-----------+-----------------+