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

Python Pandas:分组并将列值转为表头的实现方法

问题:将组织分组的布尔值统计转换为宽表格式

你现在有一个包含组织和布尔值的DataFrame,示例数据如下:

Organisation Value
A            True
A            True
A            False
A            False
A            True
A            False
B            True
B            True
C            False
C            False

想要转换为每个组织一行,以True和False作为表头并统计对应数量的格式:

Organisation True False
A            3    3
B            2    0
C            0    2

你当前使用的代码sqlDf.groupby(['Organisation','Value']).size().reset_index(name='counts')只能得到长表格式,无法直接生成目标的宽表,下面是几种可行的解决方法:


方法1:使用Pandas的pivot方法

先分组统计数量,再通过pivot重塑表格结构:

# 先分组统计每个组织对应布尔值的数量
count_df = sqlDf.groupby(['Organisation', 'Value']).size().reset_index(name='counts')
# 重塑为宽表,用fillna(0)补全缺失的0值(比如B没有False的情况)
result_df = count_df.pivot(index='Organisation', columns='Value', values='counts').fillna(0).reset_index()
# 清除列名的层级标记,让表头更整洁
result_df.columns.name = None

方法2:使用Pandas的crosstab一步到位

pd.crosstab可以直接生成交叉统计的宽表,代码更简洁:

import pandas as pd

# 直接生成组织和布尔值的交叉统计表
result_df = pd.crosstab(index=sqlDf['Organisation'], columns=sqlDf['Value']).reset_index()
# 清除列名层级标记
result_df.columns.name = None

这个方法会自动统计每个组织对应布尔值的出现次数,默认会把缺失的数值填充为0,完全符合你的需求。


方法3:如果是PySpark DataFrame(假设你的sqlDf是Spark数据集)

如果你的sqlDf是PySpark的DataFrame,可以用pivot配合聚合函数实现:

from pyspark.sql import functions as F

result_df = sqlDf.groupBy('Organisation') \
                 .pivot('Value') \
                 .count() \
                 .fillna(0)

这里pivot会把Value的唯一值作为新列,count()统计对应数量,fillna(0)负责补全那些没有对应布尔值的组织的0值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:00:47