问题描述
出于说明目的,我有一个包含 3 列 (X,Y,Z)
的数据集。现在,我想计算 2001 年到 2008 年之间一年的 Total z
或 Avg z
值。
要过滤掉年份,我知道:
ps2 = ps1.filter(lambda x: int(x[0])>2001 and int(x[0])<2008)
但是如何为每年创建一个包含 total_z
或 avg_z
值的新列?
解决方法
我不确定您是否只想要每年的平均值,但如果您想要,请使用简单聚合:
p2.groupby('X').avg('Z')
给你一个结果:
+----+------+
| X|avg(Z)|
+----+------+
|2003| 600.0|
|2002| 262.5|
+----+------+
如果您需要保留 Y
列并像这样复制相同的平均结果:
+----+---+---+-----+
| X| Y| Z| avg|
+----+---+---+-----+
|2003| FL|600|600.0|
|2002| NY|300|262.5|
|2002| AZ|225|262.5|
+----+---+---+-----+
此代码应该可以帮助您:
p2 = df.filter((df['X'] > 2001) & (df['X'] < 2008))
partitioned = Window.partitionBy('X')
result = p2.withColumn('avg',avg('Z').over(partitioned))
result.show()