2017-06-06 108 views
1

我正在计算数据帧中列的平均值,但它导致所有值为零。有人可以帮我解释为什么会发生这种情况吗?以下是在转换一列之前和之后的代码和表格。Pyspark:将平均值作为新列添加到DataFrame中

之前计算的平均值和增加“的意思是”列

result.select("dis_price_released").show(10) 
+------------------+ 
|dis_price_released| 
+------------------+ 
|    0.0| 
|    4.0| 
|    4.0| 
|    4.0| 
|    1.0| 
|    4.0| 
|    4.0| 
|    0.0| 
|    4.0| 
|    0.0| 
+------------------+ 

计算平均值和增加意味着柱

w = Window().partitionBy("dis_price_released").rowsBetween(-sys.maxsize, sys.maxsize) 
df2 = result.withColumn("mean", avg("dis_price_released").over(w)) 
df2.select("dis_price_released", "mean").show(10) 

+------------------+----+ 
|dis_price_released|mean| 
+------------------+----+ 
|    0.0| 0.0| 
|    0.0| 0.0| 
|    0.0| 0.0| 
|    0.0| 0.0| 
|    0.0| 0.0| 
|    0.0| 0.0| 
|    0.0| 0.0| 
|    0.0| 0.0| 
|    0.0| 0.0| 
|    0.0| 0.0| 
+------------------+----+ 
+0

什么'-sys.maxsize,sys.maxsize',你计算滚动平均值? – mtoto

+0

另外,你为什么要用你想计算平均值的相同值来划分你的数据? – mtoto

+0

@mtoto问你第一个问题是选择所有的行。并针对您的上述问题,选择特定的“dis_price_released”列。如果我错了,请纠正我。 – thetna

回答

2

后,你可以计算avg第一整个列,然后使用lit()添加它作为你的变量DataFrame,不需要窗口函数:

from pyspark.sql.functions import lit 

mean = df.groupBy().avg("dis_price_released").take(1)[0][0] 
df.withColumn("test", lit(mean)).show() 
+------------------+----+ 
|dis_price_released|test| 
+------------------+----+ 
|    0.0| 2.5| 
|    4.0| 2.5| 
|    4.0| 2.5| 
|    4.0| 2.5| 
|    1.0| 2.5| 
|    4.0| 2.5| 
|    4.0| 2.5| 
|    0.0| 2.5| 
|    4.0| 2.5| 
|    0.0| 2.5| 
+------------------+----+ 
+0

谢谢。但是,你能解释一下**(1)[0] [0] **做了什么? – thetna

+1

它从'take(1)'产生的列表中的'Row'对象中提取实际的数字。 – mtoto

0

这是另一种方式来解决这个问题

df.withColumn("mean", lit(df.select(avg("dis_price_released").as("temp")).first().getAs("temp"))).show 
相关问题