Файл Pyspark заполняется значением из другого фрейма данных

#dataframe #pyspark #fillna

#фрейм данных #pyspark #заполняет файл

Вопрос:

Итак, что я пытаюсь сделать, это заполнить нулевые значения столбца доходов, которые у меня есть в фрейме данных, средним доходом каждой группы магазинов.

Исходный фрейм данных:

 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 для каждого хранилища.

Ответ №1:

Чтобы заменить нули средним доходом на магазин, используйте 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|
 ------- ----------- ------- 
  

Вычислите среднее значение для каждого окна и замените revenue на mean всякий раз, когда оно есть null .

 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|
 ------- ----------- -----------------