【问题标题】:Unsure how to apply row-wise normalization on pyspark dataframe不确定如何在 pyspark 数据帧上应用逐行规范化
【发布时间】:2020-12-22 05:39:24
【问题描述】:

免责声明:我是 Pyspark 的初学者。

对于一行中的每个单元格,我想应用以下函数

new_col_i = col_i / max(col_1,col_2,col_3,...,col_n)

最后,我希望值的范围从 0.0 到 1.0。

这是我的数据框的详细信息:

  • 尺寸:(6.5M,2905)
  • Dtypes:双重

初始 DF:

+-----+-------+-------+-------+
|.  id|  col_1|  col_2| col_n |
+-----+-------+-------+-------+ 
|    1|    7.5|    0.1|    2.0|
|    2|    0.3|    3.5|   10.5|
+-----+-------+-------+-------+

更新的 DF:

+-----+-------+-------+-------+
|.  id|  col_1|  col_2| col_n |
+-----+-------+-------+-------+ 
|    1|    1.0|  0.013|   0.26|
|    2|  0.028|   0.33|    1.0|
+-----+-------+-------+-------+

任何帮助将不胜感激。

【问题讨论】:

  • 样本和预期输出。
  • @lamanus 啊,很抱歉。已添加

标签: pyspark


【解决方案1】:

您可以从列数组中找到最大值并循环您的数据框以替换规范化的列值。

cols = df.columns[1:]

import builtins as p

df2 = df.withColumn('max', array_max(array(*[col(c) for c in cols]))) \

for c in cols:
    df2 = df2.withColumn(c, col(c) / col('max'))
    
df2.show()

+---+-------------------+--------------------+-------------------+----+
| id|              col_1|               col_2|              col_n| max|
+---+-------------------+--------------------+-------------------+----+
|  1|                1.0|0.013333333333333334|0.26666666666666666| 7.5|
|  2|0.02857142857142857|  0.3333333333333333|                1.0|10.5|
+---+-------------------+--------------------+-------------------+----+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2021-11-13
    • 2018-11-16
    • 2018-12-12
    • 1970-01-01
    • 2017-01-07
    • 2017-08-22
    相关资源
    最近更新 更多