gpt4 book ai didi

apache-spark - 将转换应用于多列 pyspark 数据框

转载 作者:行者123 更新时间:2023-12-03 14:03:38 26 4
gpt4 key购买 nike

假设我有以下 Spark 数据框:

+-----+-------+
| word| label|
+-----+-------+
| red| color|
| red| color|
| blue| color|
| blue|feeling|
|happy|feeling|
+-----+-------+

可以使用以下代码创建:

sample_df = spark.createDataFrame([
('red', 'color'),
('red', 'color'),
('blue', 'color'),
('blue', 'feeling'),
('happy', 'feeling')
],
('word', 'label')
)

我可以执行 groupBy()获取每个单词标签对的计数:

sample_df = sample_df.groupBy('word', 'label').count()
#+-----+-------+-----+
#| word| label|count|
#+-----+-------+-----+
#| blue| color| 1|
#| blue|feeling| 1|
#| red| color| 2|
#|happy|feeling| 1|
#+-----+-------+-----+

然后 pivot()sum()将标签计为列:

import pyspark.sql.functions as f
sample_df = sample_df.groupBy('word').pivot('label').agg(f.sum('count')).na.fill(0)
#+-----+-----+-------+
#| word|color|feeling|
#+-----+-----+-------+
#| red| 2| 0|
#|happy| 0| 1|
#| blue| 1| 1|
#+-----+-----+-------+

改变这个的最好方法是什么 dataframe这样每一行除以该行的总数?

# Desired output
+-----+-----+-------+
| word|color|feeling|
+-----+-----+-------+
| red| 1.0| 0.0|
|happy| 0.0| 1.0|
| blue| 0.5| 0.5|
+-----+-----+-------+

实现此结果的一种方法是使用 __builtin__.sum (NOT pyspark.sql.functions.sum) 获取行式总和,然后调用 withColumn()对于每个标签:

labels = ['color', 'feeling']

sample_df.withColumn('total', sum([f.col(x) for x in labels]))\
.withColumn('color', f.col('color')/f.col('total'))\
.withColumn('feeling', f.col('feeling')/f.col('total'))\
.select('word', 'color', 'feeling')\
.show()

但是必须有比枚举每个可能的列更好的方法。

更一般地说,我的问题是:

如何将任意转换(即当前行的函数)同时应用于多列?

最佳答案

this Medium post 上找到了答案.

首先为总数创建一个列(如上),然后使用 *运算符在 select() 中的标签上解压列表推导式:

labels = ['color', 'feeling']
sample_df = sample_df.withColumn('total', sum([f.col(x) for x in labels]))

sample_df.select(
'word', *[(f.col(col_name)/f.col('total')).alias(col_name) for col_name in labels]
).show()

链接帖子中显示的方法显示了如何将其推广到任意转换。

关于apache-spark - 将转换应用于多列 pyspark 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48452076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com