Pyspark 中的 Groupby 和标准化值

Posted

技术标签:

【中文标题】Pyspark 中的 Groupby 和标准化值【英文标题】:Groupby and Standardise values in Pyspark 【发布时间】:2021-03-15 17:34:34 【问题描述】:

所以,我有一个类型的 Pyspark 数据框

Group Value
A 12
B 10
A 1
B 0
B 1
A 6

并且我想执行一个操作,以生成具有关于其组的标准化值的 DataFrame。

简而言之,我应该:

Group Value
A 1.26012384
B 1.4083737
A -1.18599891
B -0.81537425
B -0.59299945
A -0.07412493

认为这应该通过使用 groupBy 然后一些 agg 操作来执行,但老实说我不太确定如何去做

【问题讨论】:

你想要的输出是什么,为什么?换句话说,标准化值是什么意思。 @Andrew 现在应该更清楚了 但是你用的是什么逻辑?你是如何提出这些价值观的?第一行是如何产生 1.26012384 的? 【参考方案1】:

您可以使用窗口函数计算每组中的平均值和标准差:

from pyspark.sql import functions as F, Window

df2 = df.withColumn(
    'Value', 
    (F.col('Value') - F.mean('Value').over(Window.partitionBy('Group'))) / 
    F.stddev_pop('Value').over(Window.partitionBy('Group'))
)

df2.show()
+-----+--------------------+
|Group|               Value|
+-----+--------------------+
|    B|  1.4083737016560922|
|    B| -0.8153742483272112|
|    B| -0.5929994533288808|
|    A|  1.2601238383238722|
|    A| -1.1859989066577619|
|    A|-0.07412493166611006|
+-----+--------------------+

请注意,结果的顺序将是随机的,因为 Spark 数据帧没有索引。

【讨论】:

以上是关于Pyspark 中的 Groupby 和标准化值的主要内容,如果未能解决你的问题,请参考以下文章

PySpark 中的 Groupby 和 UDF/UDAF,同时保持 DataFrame 结构

如何使用 groupby 和聚合将 pyspark 数据框中的行与多列连接起来

Groupby 和 collect_list 基于 PySpark 中的另一列维护顺序

如何将 groupBy 和聚合函数应用于 PySpark DataFrame 中的特定窗口?

按组规范化pyspark数据帧

如何在 Pyspark 中使用 groupby 和数组元素?