pandas多级索引缺失类别补全 reindex保留原值填0问题咨询
解决方案
你可以通过两种方式实现需求,都不会丢失原有有效数据,缺失条目自动填充0:
方法1:全量组合左关联(兼容性更强,无索引操作门槛)
先基于全量类别字典生成所有group+class的组合,再和原数据做左关联即可:
import pandas as pd # 你的原数据 df = pd.DataFrame(data={'group' : ['A','A','B','B','C','D'], 'class': ['g1','g2','g2','g3','g1','g2'], 'total' : [3,14,12,11,21,9]}) # 全量类别字典 dic = {'group':['A','B','C','D','E'], 'class' : ['g1','g2','g3']} # 生成所有group和class的全量笛卡尔积组合 full_combo = pd.DataFrame([(g, c) for g in dic['group'] for c in dic['class']], columns=['group', 'class']) # 左关联原数据,缺失的total值填充为0 result = full_combo.merge(df, on=['group', 'class'], how='left').fillna(0) # 修正数据类型(fillna后total可能变成float类型,按需转回int) result['total'] = result['total'].astype(int)
方法2:双索引reindex实现(写法更简洁)
如果之前用reindex失效,大概率是没有先正确设置双索引,正确写法如下:
# 先将原df设置为group+class的双索引结构 df_indexed = df.set_index(['group', 'class']) # 基于全量字典生成标准双索引 full_index = pd.MultiIndex.from_product([dic['group'], dic['class']], names=['group', 'class']) # 重排索引,缺失值填充0后恢复为普通列 result = df_indexed.reindex(full_index, fill_value=0).reset_index()
补充说明
如果你的实际业务数据中存在同一个group+class组合对应多条重复记录,可以先对原df按['group','class']做对应聚合(如求和、计数)后再执行上述操作即可。
内容的提问来源于stack exchange,提问作者an10b3
相关产品推荐
相关产品推荐

