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 中的另一列维护顺序