Skip to main content
 首页 » 编程设计

python之按组规范化pyspark数据帧

2024年09月03日29dudu

我想按组规范化 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'))