将每个值除以其组的平均值
Posted
技术标签:
【中文标题】将每个值除以其组的平均值【英文标题】:Divide each value by its group's average 【发布时间】:2021-04-28 00:15:45 【问题描述】:在 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。
【问题讨论】:
“按另一列进行分组,然后划分每个值”——好计划!这样做:) 不好,因为分组时会丢失所有行。我需要每个值都有另一个对应的值,它是前一个值除以其组的平均值 【参考方案1】:使用窗口函数。小心除以零。
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|
+----+-----+------+
【讨论】:
以上是关于将每个值除以其组的平均值的主要内容,如果未能解决你的问题,请参考以下文章