如何统计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
相关产品推荐
相关产品推荐

