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

如何统计DataFrame两列所有组合的出现次数并生成表格?

统计DataFrame两列组合出现次数的简便方法

嗨,我来帮你搞定这个需求!你想要把DataFrame中两列的所有组合出现次数整理成指定的表格形式,其实pandas有非常顺手的内置工具,比你当前用itertools.product的方式高效多啦~

最简便的方案:用pd.crosstab()

pandas的crosstab函数就是专门用来计算两列数据的交叉频率的,一行代码就能直接生成你要的结果:

import pandas as pd

d = {'ballot1': ['a','b','a','a','b','a','a','b'], 'ballot1_x':['c','c','d','d','a','a','a','a']}
df1 = pd.DataFrame(d)

# 生成交叉统计表:行是ballot1_x的唯一值,列是ballot1的唯一值,单元格是对应组合的出现次数
result = pd.crosstab(df1['ballot1_x'], df1['ballot1'])
print(result)

运行后输出的结果完全符合你的目标格式:

ballot1   a  b
ballot1_x     
a         3  1
c         1  1
d         2  0

它会自动覆盖所有可能的组合,哪怕某个组合没出现过(比如d和b),也会用0填充,你可以通过fill_value参数修改填充值。

基于你现有代码的改进方案

如果你想沿着自己的思路调整,也可以先统计每个组合的次数,再转换成表格:

from itertools import product
import pandas as pd

d = {'ballot1': ['a','b','a','a','b','a','a','b'], 'ballot1_x':['c','c','d','d','a','a','a','a']}
df1 = pd.DataFrame(d)

# 获取两列的所有可能组合
all_combinations = list(product(set(df1['ballot1']), set(df1['ballot1_x'])))
# 统计每个组合的实际出现次数,没有出现的补0
counts = df1.groupby(['ballot1', 'ballot1_x']).size().reindex(all_combinations, fill_value=0)
# 转换为目标DataFrame格式
result = counts.unstack(level=0)
print(result)

这个方法也能得到相同结果,但显然pd.crosstab()更简洁省心。

另一种可选方案:用pivot_table

如果你熟悉透视表的用法,也可以用pivot_table实现同样的效果:

result = df1.pivot_table(index='ballot1_x', columns='ballot1', aggfunc='size', fill_value=0)

总结一下,优先推荐pd.crosstab(),它专门为这类交叉统计场景设计,代码最简洁,可读性也最高~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:07:44