这是我的示例数据:
date,number
2018-06-24,13
2018-06-25,4
2018-06-26,5
2018-06-27,1
2017-06-24,3
2017-06-25,5
2017-06-26,2
2017-06-27,null
2016-06-24,3
2016-06-25,5
2016-06-26,2
2016-06-27,7
2015-06-24,8
2015-06-25,9
2015-06-26,12
2015-06-27,13
我需要用上一年数据的平均值填充空值。
也就是说,如果'2017-06-27'
为空值,则需要用"2016-06-27"
和'2015-06-27'
数据的均值来填充它。
输出
date,number
2018-06-24,13
2018-06-25,4
2018-06-26,5
2018-06-27,1
2017-06-24,3
2017-06-25,5
2017-06-26,2
2017-06-27,10
2016-06-24,3
2016-06-25,5
2016-06-26,2
2016-06-27,7
2015-06-24,8
2015-06-25,95
2015-06-26,12
2015-06-27,13
我使用了下面的代码,但它使我了解了垂直分区中的所有内容。
提取日期和月份列
wingrp = Window.partitionBy('datee','month')
df = df.withColumn("TCount",avg(df["Count"]).over(wingrp))
答案 0 :(得分:0)
您的解决方案是朝正确方向迈出的一步(即使您没有显示已添加的列)。您需要在窗口中按月和月中的天进行分区,然后按日期列对生成的窗口进行排序(因此基本上按年份),然后将窗口限制为前面的所有行。像这样:
from pyspark.sql.functions import *
from pyspark.sql.types import *
from pyspark.sql.window import Window
schema = StructType([
StructField("date", DateType(), True),
StructField("number", IntegerType(), True)
])
df = spark.read.csv("your_data.csv",
header=True,
schema=schema)
wind = (Window
.partitionBy(month(df.date), dayofmonth(df.date))
.orderBy("date")
.rowsBetween(Window.unboundedPreceding, Window.currentRow)
)
result = (df
.withColumn("result",
coalesce(df.number, avg(df.number).over(wind)))
)