python - 如何聚合多个列并输出为行?
问题描述
我正在使用 pyspark,我有这样的数据:
col1 | col2 | col3 |
---|---|---|
1 | 0 | 1 |
1 | 1 | 0 |
1 | 1 | 0 |
1 | 0 | 0 |
我想要的输出是:
山口 | 和 |
---|---|
col1 | 4 |
col2 | 2 |
col3 | 1 |
我的第一个想法是将列名放在一个列表中,循环遍历它,每次对该列求和并将结果合并到一个新的 df 中。
然后我想,也许可以进行多个聚合,例如:
df.agg(sum('col1), sum('col2))
...然后找出一种方法来取消透视。
有没有更简单的方法?
解决方案
您可以使用stack
SQL 函数来取消透视数据帧,如此处所述。因此,您的代码将成为input
您的输入数据框:
from pyspark.sql import functions as F
output = input.agg(
F.sum("col1").alias("col1"),
F.sum("col2").alias("col2"),
F.sum("col3").alias("col3")
).select(
F.expr("stack(3, 'col1', col1, 'col2', col2, 'col3', col3) as (col,sum)")
)
如果您有以下input
数据框:
+----+----+----+
|col1|col2|col3|
+----+----+----+
|1 |0 |1 |
|1 |1 |0 |
|1 |1 |0 |
|1 |0 |0 |
+----+----+----+
您将获得以下output
数据框:
+----+---+
|col |sum|
+----+---+
|col1|4 |
|col2|2 |
|col3|1 |
+----+---+
推荐阅读
- arrays - 为什么我可以从 Vec 而不是从数组创建盒装迭代器?
- node.js - 通过 POST 将 PDF 填写表单数据从 React 应用程序传递到 node-pdftk (Express)
- c++ - 编译器错误,将类链接作为方法参数时
- python - 在 Pyspark 中将任意数量的列组合成 Array 类型的新列
- html - 当我在 Bootstrap 4.5 中加载页面时,单选按钮立即全部激活
- python - 如果他们不存在,我如何让我的不和谐机器人将某人添加到 json 文件中
- reactjs - NavigationEvents onWillFocus vs useEffect
- r - R中是否有检查r脚本或日志中是否有错误的功能?
- java - 有没有办法验证文件是否是Java中的特殊块文件?
- javascript - JavaScript 问题在对象内转换字符串(循环内)