2017-06-06 41 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

を意味追加した後、追加するlit()を使用し、その後、全体の列の最初のavgを計算することができますそれはあなたの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

ありがとうございます。しかし、**あなたは何が**(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 
関連する問題