[英]Divide each value by its group's average
在 pyspark 如何創建第二列,其中第一列的每個值除以其組的平均值?
這意味着您按另一列進行一些平均分組,然后將每個值除以其組的平均值。
但是,當您對松散的行進行分組時,就會出現問題。 我該如何解決? 例子:
Name value
A 5
B 1
A 3
A 4
B 1
我想實現這個新的df
Name value result
A 5 5/4
B 1 1
A 3 3/4
A 4 1
B 1 1
因為 A 組和 B 組的平均值分別為 4 和 1。
使用 window function。 小心除以零。
from pyspark.sql.window import Window
from math import nan
import pyspark.sql.functions as func
list = [('A', 5), ('B', 1), ('A', 3), ('A', 4), ('B', 1), ('C', 0)]
df = sqlContext.createDataFrame(list, ['name', 'value'])
df.withColumn("avg", func.avg(df["value"]).over(Window.partitionBy(df["name"]))) \
.withColumn("result", func.col("value") / func.col("avg")) \
.drop("avg") \
.show()
+----+-----+------+
|name|value|result|
+----+-----+------+
| A| 5| 1.25|
| A| 3| 0.75|
| A| 4| 1.0|
| B| 1| 1.0|
| B| 1| 1.0|
| C| 0| null|
+----+-----+------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.