2017-06-06 110 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 
相關問題