如何在pyspark中对spark dataframe中的多个列求和?

16

我有一个列名列表,我想对它们求和

columns = ['col1','col2','col3']

如何将这三列相加并放入一个新的列中?(自动化地实现,以便我可以更改列列表并获得新的结果)

我想要的结果的数据框:

col1   col2   col3   result
 1      2      3       6

可能是如何使用PySpark向Spark DataFrame添加新列?的重复问题。 - Prasad Khode
谢谢您的回答!我知道如何添加列,我只是想根据一个包含列名的列表高效地添加它们。 - Manrique
3个回答

31
[简而言之,]

你可以做到这件事:

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]))

如果您有一个静态列列表,您可以这样做:

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)。


11

试试这个:

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

df.columns 将会返回 df 的所有列。


3
我已经用下面的数据框尝试复制并获得了一个错误: listA = [(10,20,40,60),(10,10,10,40)] df = spark.createDataFrame(listA, ['M1','M2','M3','M4']) newdf = df.withColumn('result', sum(df[col] for col in df.columns)) 请查看下面的错误:TypeError: 'Column' object is not callable. 是否有什么我漏掉的东西? - vikrant rana

11

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

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

  1. PySpark的sum函数不支持列相加(Pyspark版本2.3.1)。
  2. 内置的Pythonsum函数适用于某些人,但对其他人会报错。

因此,可以使用PySpark中的expr函数来实现多列相加,该函数接受一个要计算的表达式作为输入。

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))

这样就能得到所需的列之和。我们还可以使用任何其他复杂表达式来获得其他输出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接