python在dataframe的列上应用map函数

xmjla07d  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(486)

我需要将Dataframe的所有列的值合并为每列的一个值。所以列保持不变,但我只是对所有相应的值求和。为此,我打算利用这个功能:

def sum_col(data, col):
    return data.select(f.sum(col)).collect()[0][0]

我正在想这样做:

data = data.map(lambda current_col: sum_col(data, current_col))

这是可行的,还是我需要另一种方法来合并所有列的值?

dfty9e19

dfty9e191#

你可以通过求和函数来实现

import pyspark.sql.functions as f
df.select(*[f.sum(cols).alias(cols) for cols in df.columns]).show()

+----+---+---+
|val1|  x|  y|
+----+---+---+
|  36| 29|159|
+----+---+---+
hc8w905p

hc8w905p2#

要将所有列求和为一个新列,可以使用python的sum函数来理解列表

import pyspark.sql.functions as F
from pyspark.sql.functions import udf
from pyspark.sql.types import *
tst= sqlContext.createDataFrame([(10,7,14),(5,1,4),(9,8,10),(2,6,90),(7,2,30),(3,5,11)],schema=['val1','x','y'])
tst_sum= tst.withColumn("sum_col",sum([tst[coln] for coln in tst.columns]))

结果:

tst_sum.show()
+----+---+---+-------+
|val1|  x|  y|sum_col|
+----+---+---+-------+
|  10|  7| 14|     31|
|   5|  1|  4|     10|
|   9|  8| 10|     27|
|   2|  6| 90|     98|
|   7|  2| 30|     39|
|   3|  5| 11|     19|
+----+---+---+-------+

注意:如果您从pyspark函数导入sum函数 from import pyspark.sql.functions import sum 然后你得把名字改成别的名字,比如 from import pyspark.sql.functions import sum_pyspark

相关问题