我有一个列名列表,我想对它们求和
columns = ['col1','col2','col3']
如何将这三列相加并放入一个新的列中?(自动化地实现,以便我可以更改列列表并获得新的结果)
我想要的结果的数据框:
col1 col2 col3 result
1 2 3 6
我有一个列名列表,我想对它们求和
columns = ['col1','col2','col3']
如何将这三列相加并放入一个新的列中?(自动化地实现,以便我可以更改列列表并获得新的结果)
我想要的结果的数据框:
col1 col2 col3 result
1 2 3 6
你可以做到这件事:
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
)。
试试这个:
df = df.withColumn('result', sum(df[col] for col in df.columns))
df.columns
将会返回 df 的所有列。
我尝试了很多方法,以下是我的观察:
sum
函数不支持列相加(Pyspark版本2.3.1)。sum
函数适用于某些人,但对其他人会报错。因此,可以使用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))