我想按组规范化 pyspark 中的数据框。提出的解决方案here没有帮助,因为我想转换数据框中的每一列。 我在 pandas df 上使用 python 的代码如下:
df_norm = (X_df
.groupby('group')
.transform(lambda x: (x - x.min())/(x.max() - x.min()))
.fillna(0))
我如何在 pyspark 中使用 df 或 RDD 执行此操作?
例子: 输入:
columns = ['group', 'sensor1', 'sensor2', 'sensor3']
vals = [
(a, 0.8, 0.02, 100),
(a, 0.5, 0.1, 200),
(a, 1, 0.5, 50),
(a, 0, 0.8, 30)
(b, 10, 1, 0)
(b, 20, 2, 3)
(b, 5, 4, 1)
]
期望的输出:
columns = ['group','sensor1', 'sensor2', 'sensor3']
vals = [
(a, 0.8, 0, 0.4118),
(a, 0.5, 0.1026, 1),
(a, 1, 0.615, 0.11),
(a, 0, 1, 0)
(b, 0.333, 0, 0)
(b, 1, 0.333, 1)
(b, 0, 1, 0.333)
]
请您参考如下方法:
我最终是这样做的:
w = Window.partitionBy('group')
for c in cols_to_normalize:
df = (df.withColumn('mini', F.min(c).over(w))
.withColumn('maxi', F.max(c).over(w))
.withColumn(c, ((F.col(c) - F.col('mini')) / (F.col('maxi') - F.col('mini'))))
.drop('mini')
.drop('maxi'))
