Pandas分组统计值类型时如何为组内缺失类型补0计数
实现方法
普通groupby().size()仅会统计数据中实际存在的id+value_type组合,要补全缺失组合的0计数,核心是先构造两个维度的全量组合,再对齐计数结果,以下是两种可直接运行的实现方案:
方案1:通用reindex方案(适配自定义枚举值场景)
先构造测试数据:
import pandas as pd df = pd.DataFrame({ 'id': [1,1,1,2,3,3], 'value_type': ['b','a','a','a','a','b'] })
实现代码:
# 先统计已有组合的计数 count_res = df.groupby(['id', 'value_type']).size().rename('cnt') # 生成id、value_type的全量笛卡尔积索引 full_pair = pd.MultiIndex.from_product( [df['id'].unique(), df['value_type'].unique()], names=['id', 'value_type'] ) # 对齐索引,缺失计数填0,重置为普通二维表 result = count_res.reindex(full_pair, fill_value=0).reset_index()
运行后输出结果和预期完全一致:
id value_type cnt 0 1 b 1 1 1 a 2 2 2 b 0 3 2 a 1 4 3 b 1 5 3 a 1
如果value_type是固定枚举值(比如需要固定统计a/b/c三类,哪怕原始数据中未出现c),直接把df['value_type'].unique()替换为自定义枚举列表即可,例如['a','b','c']。
方案2:crosstab简洁实现(无自定义枚举场景)
如果仅需统计原始数据中出现过的所有value_type,可直接用交叉表转长表实现,代码更短:
result = pd.crosstab(df['id'], df['value_type']).stack().rename('cnt').reset_index()
输出结果和方案1完全一致。
内容的提问来源于stack exchange,提问作者gh1222
相关产品推荐
相关产品推荐

