簡體   English   中英

Pyspark Groupby創建列

[英]Pyspark Groupby Create Column

在 Pyspark 中,我需要按ID分組並創建四個新列(min、max、std、ave)。

from pyspark.sql import functions as F
from pyspark.sql.window import Window

w = (Window.orderBy(F.col("Date").cast('long')).rowsBetween(-4, 0))

df = df.groupby("ID") \
.withColumn('hr1_ave', F.avg("rpm").over(w))\
.withColumn('hr1_std', F.stddev("rpm").over(w))\
.withColumn('hr1_min', F.min("rpm").over(w))\
.withColumn('hr1_max', F.max("rpm").over(w))

我也試過:

df.groupby("ID").select('rpm', f.avg('rpm').over(w).alias('hr1_avg'))

但是我對這兩個命令都收到此錯誤:

AttributeError: 'GroupedData' object has no attribute 'withColumn'

有沒有辦法為每個ID創建一個新列並創建這些列,或者我的語法不正確?

謝謝。

您需要將“分組”列ID移動到 window 定義中作為partitionBy的參數。 然后groupBy不是必需的:

代碼

w = Window.partitionBy("ID").orderBy(F.col("Date").cast('long')).rowsBetween(-4, 0)

df \
.withColumn('hr1_ave', F.avg("rpm").over(w))\
.withColumn('hr1_std', F.stddev("rpm").over(w))\
.withColumn('hr1_min', F.min("rpm").over(w))\
.withColumn('hr1_max', F.max("rpm").over(w)) \
.show()

應該打印您的預期結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM