You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark如何对存储0/1值的多列DataFrame做聚合统计生成汇总表

Spark DataFrame 0/1列取值计数统计方案

你可以通过行列转置+分组聚合的方式实现需求,无需手动逐一编写20列的聚合逻辑,通用实现代码如下:

提示:如果源DataFrame包含不需要统计的非0/1列,只需要修改统计列列表的赋值逻辑,过滤掉不需要的列即可。

PySpark 实现

from pyspark.sql import functions as F

# 替换为你自己的源DataFrame
source_df = 你的初始DataFrame
# 获取所有需要统计的0/1列
stat_columns = source_df.columns

# 构造unpivot(行转列)表达式,将所有统计列转为[列名, 取值]的长表结构
stack_expression = f"stack({len(stat_columns)}, {','.join([f"'{col}', {col}" for col in stat_columns])}) as (col_name, Values)"

# 转长表 -> 按取值+列名分组计数 -> 再转成目标宽表格式
result_df = source_df.select(F.expr(stack_expression)) \
              .groupBy("Values") \
              .pivot("col_name") \
              .count() \
              .orderBy("Values")

# 查看结果
result_df.show()

# 若需输出为|分隔的文本文件,可执行以下代码
# result_df.write.option("sep", "|").csv("你的输出目录路径", header=True)

Scala Spark 实现

import org.apache.spark.sql.functions._

// 替换为你自己的源DataFrame
val sourceDf = 你的初始DataFrame
val statColumns = sourceDf.columns.toSeq

// 构造unpivot表达式
val stackExpression = s"stack(${statColumns.size}, ${statColumns.map(col => s"'$col', $col").mkString(",")}) as (col_name, Values)"

val resultDf = sourceDf.select(expr(stackExpression))
                 .groupBy("Values")
                 .pivot("col_name")
                 .count()
                 .orderBy("Values")

resultDf.show()

输出结果的结构完全符合要求,第一列为Values(取值0、1),后续每列为原DataFrame的字段,单元格值为对应列下0/1的出现次数。

内容的提问来源于stack exchange,提问作者puneet madan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:06:04