簡體   English   中英

如何對pyspark中的spark數據幀中的多列求和?

[英]How can I sum multiple columns in a spark dataframe in pyspark?

我有一個要匯總的列名列表

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

如何添加這三個並將其放入新列中? (以自動方式,以便我可以更改列列表並獲得新結果)

帶有我想要的結果的數據框:

col1   col2   col3   result
 1      2      3       6

[編輯以解釋每個步驟]

如果您有靜態列列表,則可以執行以下操作:

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

但是,如果您不想鍵入整個列列表,則需要迭代生成短語col("col1") + col("col2") + col("col3") 為此,您可以使用帶有add函數的reduce方法來獲得:

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")而不是簡單的字符串 concat (生成( 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]))

嘗試這個:

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

df.columns將是來自 df 的列列表。

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

我嘗試了很多方法,以下是我的觀察:

  1. PySpark 的sum函數不支持列加法(Pyspark 2.3.1 版)
  2. 內置 python 的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))

這為我們提供了所需的列總和。 我們還可以使用任何其他復雜表達式來獲得其他輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM