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