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

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'])

接下来分四步操作:

  1. 先做分组求和,保留为普通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
  1. 生成所有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组合。

  1. 左连接完整组合与求和结果
result = pd.merge(full_combinations, sum_df, on=['Country','Class'], how='left')

左连接会保留完整组合里的所有行,没有对应求和值的位置会自动填充NaN。

  1. 转为你期望的多级索引格式
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:42:56