Pandas按两列分组后,如何为每个分组保留所有Class的可能值?
解决方法:补全分组中缺失的Class组合
这问题我之前处理过,核心是得先构造出所有Country和Class的完整组合,再和分组求和后的结果做关联,这样就能自动补全每个Country缺失的Class项,对应值填充为NaN了。
完整步骤代码
先还原你的原始数据:
import pandas as pd df = pd.DataFrame(data=[['Sweden','A',5], ['Sweden','A',10], ['Norway','B',4], ['Norway','C',5]], columns=['Country','Class','Value'])
接下来分四步操作:
- 先做分组求和,保留为普通DataFrame(避免默认的多级索引)
sum_df = df.groupby(['Country','Class'], as_index=False).sum()
此时sum_df是便于后续合并的普通结构:
Country Class Value 0 Norway B 4 1 Norway C 5 2 Sweden A 15
- 生成所有Country和Class的笛卡尔积(即所有可能的组合)
# 提取数据中所有唯一的国家和类别 all_countries = df['Country'].unique() all_classes = df['Class'].unique() # 构造包含全部组合的DataFrame full_combinations = pd.DataFrame( pd.MultiIndex.from_product([all_countries, all_classes], names=['Country','Class']), columns=['Country','Class'] )
这一步会生成6条记录(2个国家×3个类别),覆盖所有可能的Country+Class组合。
- 左连接完整组合与求和结果
result = pd.merge(full_combinations, sum_df, on=['Country','Class'], how='left')
左连接会保留完整组合里的所有行,没有对应求和值的位置会自动填充NaN。
- 转为你期望的多级索引格式
result = result.set_index(['Country','Class'])
最终结果
运行后得到的result完全符合你的需求:
Value Country Class Sweden A 15.0 B NaN C NaN Norway B 4.0 C 5.0 A NaN
简化写法(一行搞定)
如果觉得步骤繁琐,也可以用更简洁的写法,本质逻辑一致:
result = df.groupby(['Country','Class'])['Value'].sum()\ .reindex(pd.MultiIndex.from_product([df['Country'].unique(), df['Class'].unique()], names=['Country','Class']))
直接用reindex将分组求和结果的索引替换为完整组合,缺失项自动填充NaN。
内容的提问来源于stack exchange,提问作者Bera
相关产品推荐
相关产品推荐

