首页 > 解决方案 > 如何对 PySpark Dataframe 中的多列求和

问题描述

我有一个带有 int 值的数据框,我想单独对每一列求和,然后测试该列的总和是否高于 5。如果列的总和高于 5,那么我想将其添加到 feature_cols。我在网上找到的答案只适用于 pandas 而不是 PySpark。(我正在使用 Databricks)

这是我到目前为止所拥有的:

working_cols = df.columns

for x in range(0, len(working_cols)): 
    if df.agg(sum(working_cols[x])) > 5:
        feature_cols.append(working_cols[x])

当前的输出是 feature_cols 具有每一列,即使有些总和小于 5。

Out[166]: 
['Column_1',
 'Column_2',
 'Column_3',
 'Column_4',
 'Column_5',
 'Column_6',
 'Column_7',
 'Column_8',
 'Column_9',
 'Column_10']

标签: apache-sparkpyspark

解决方案


我不是 python 专家,但在您的循环中,您将 aDataFrame[sum(a): bigint]与 5 进行比较,出于某种原因,答案是 True。

df.agg(sum(working_cols[x])).collect()[0][0]应该给你你想要的。我实际上将数据帧收集到驱动程序,选择第一行(只有一个)并选择第一列(也只有一个)。

请注意,就性能而言,您的方法不是最佳的。您可以像这样只通过一次数据帧来计算所有总和:

sums = [F.sum(x).alias(str(x)) for x in df.columns]
d = df.select(sums).collect()[0].asDict()

使用此代码,您将拥有一个字典,它将每个列名与其总和相关联,并且您可以在其上应用任何您感兴趣的逻辑。


推荐阅读