为了账号安全,请及时绑定邮箱和手机立即绑定

如何对pyspark中的spark数据帧中的多列求和?

如何对pyspark中的spark数据帧中的多列求和?

胡子哥哥 2021-08-17 16:32:49
我有一个要汇总的列名列表columns = ['col1','col2','col3']如何添加这三个并将其放入新列中?(以自动方式,以便我可以更改列列表并获得新结果)带有我想要的结果的数据框:col1   col2   col3   result 1      2      3       6谢谢 !
查看完整描述

3 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

试试这个:

df = df.withColumn('result', sum(df[col] for col in df.columns))

df.columns 将是来自 df 的列列表。


查看完整回答
反对 回复 2021-08-17
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

如果您有静态列列表,则可以执行以下操作:


df.withColumn("result", col("col1") + col("col2") + col("col3"))


但是,如果您不想键入整个列列表,则需要col("col1") + col("col2") + col("col3")迭代生成短语。为此,您可以使用reduce带有add函数的方法来获取:


reduce(add, [col(x) for x in df.columns])


这些列一次添加两列,因此您将得到col(col("col1") + col("col2")) + col("col3")而不是col("col1") + col("col2") + col("col3"). 但效果是一样的。


将col(x)确保你得到col(col("col1") + col("col2")) + col("col3")一个简单的字符串连接,而不是(产生(col1col2col3)。


[TL;博士,]


结合上面的步骤,你可以做到:


from functools import reduce

from operator import add

from pyspark.sql.functions import col


df.na.fill(0).withColumn("result" ,reduce(add, [col(x) for x in df.columns]))

该df.na.fill(0)部分用于处理数据中的空值。如果您没有任何空值,则可以跳过它并改为执行此操作:


df.withColumn("result" ,reduce(add, [col(x) for x in df.columns]))


查看完整回答
反对 回复 2021-08-17
?
慕森卡

TA贡献1806条经验 获得超8个赞

将列表中的多列添加到一列中

我尝试了很多方法,以下是我的观察:


PySpark 的sum函数不支持列添加(Pyspark 版本 2.3.1)

内置python的sum功能对某些人有效,但对其他人却有错误。

因此,可以使用exprPySpark 中的函数来实现多列的添加,该函数将要计算的表达式作为输入。


from pyspark.sql.functions import expr


cols_list = ['a', 'b', 'c']


# Creating an addition expression using `join`

expression = '+'.join(cols_list)


df = df.withColumn('sum_cols', expr(expression))

这为我们提供了所需的列总和。我们还可以使用任何其他复杂表达式来获得其他输出。


查看完整回答
反对 回复 2021-08-17
  • 3 回答
  • 0 关注
  • 1238 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信