apache-spark - 如何对 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']
解决方案
我不是 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()
使用此代码,您将拥有一个字典,它将每个列名与其总和相关联,并且您可以在其上应用任何您感兴趣的逻辑。
推荐阅读
- python - 停止 subprocess.check_output 以在视频上打印
- flutter - 代码覆盖率是否支持 Flutter 项目的 DART 2?
- c# - 使用 Mailkit:“SMTP 服务器意外断开。”
- node.js - 如何避免 windows server 2016 上的 powershell 出现致命错误或未知错误
- c# - 如何将标签页动态添加到标签控件的开头
- objective-c - Square Reader SDK 上架构 armv7 的未定义符号
- reactjs - 使用 React 测试库进行测试下拉
- python - 未能在 Python 中使用 QuantLib 通货膨胀债券定价器获得正确的应计利息
- python - 如何在另一个字典的列表中打印出字典的值
- docker - 为什么docker在空目录中列出文件?