将每个值除以其组的平均值

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|
+----+-----+------+

【讨论】:

以上是关于将每个值除以其组的平均值的主要内容,如果未能解决你的问题,请参考以下文章

所有值和单独组的平均值

用 pandas 计算每个后续组的 2 行的平均值

opencv中,如何求图像的某区域均值和方差?

如何将数据框的单个值除以月平均值?

绘制 R 中 facet wraps 中每个组的平均数据(显示 geom_smooth)

如何在 SwiftUI 中计算数组的总计、小计和平均值