
本文介绍如何对具有多层列索引(multiindex)的 pandas dataframe,沿列方向按“倒数第二级索引”进行分组求和,并保留原始层级结构语义,适用于嵌套字典转换而来的教育成绩、财务指标等分层数据汇总场景。
本文介绍如何对具有多层列索引(multiindex)的 pandas dataframe,沿列方向按“倒数第二级索引”进行分组求和,并保留原始层级结构语义,适用于嵌套字典转换而来的教育成绩、财务指标等分层数据汇总场景。
在处理由嵌套字典构建的分层结构数据时(如学科→课程→考核类型→分数),Pandas 的 MultiIndex 列是自然表达方式。但默认的 .unstack().to_frame().T 流程会生成扁平化的宽表,难以直接按逻辑分组(如“Physics”下所有考核项求和)。此时,关键在于避免过早展开索引,转而利用 MultiIndex 的层级聚合能力。
正确做法是:在 pd.concat 构建完多级列后,直接调用 .sum() —— 它会自动沿最内层(即最后一级)列索引对齐并聚合同组值,结果自动压缩至倒数第二级索引维度:
import pandas as pd
nested_dict = {
'Full_Grades': {
'Science_Marks': {
'Physics': {'Theo': 99, 'Prac': 100},
'Biology': {'Theo': 89, 'Prac': 100}
},
'Finance_Marks': {
'Economics': {'Theo': 99, 'Prac': 100},
'Accounting': {'Theo': 89, 'Prac': 100}
}
}
}
# 构建 MultiIndex DataFrame(不 unstack)
out = pd.concat({
k: pd.concat({
k2: pd.DataFrame(v2) for k2, v2 in v.items()
}, axis=1)
for k, v in nested_dict.items()
}, axis=1)
# ✅ 关键:按最后一级列索引('Theo', 'Prac')分组求和 → 结果保留倒数第二级('Physics', 'Biology'...)
aggregated = out.sum(level=[0, 1, 2]).to_frame().T
print(aggregated)输出:
Full_Grades
Science_Marks Finance_Marks
Physics Biology Economics Accounting
0 199 189 199 189注意:.sum(level=[0,1,2]) 显式指定保留前3级索引(即丢弃第3级之后的层级),等价于 out.sum()(因最后一级是唯一可聚合维度)。若需更灵活控制,可用 level 参数精确指定聚合层级(如 level=[0,1] 表示合并到 Full_Grades→Science_Marks 级)。
若需同时保留原始数据与汇总行(如题中期望的带 Sum 行格式),可手动拼接:
# 原始数据(已转置为单行) original = out.to_frame().T # 汇总行(重命名索引便于识别) summary = out.sum(level=[0,1,2]).to_frame().T summary.index = ['Sum'] # 合并 result = pd.concat([original, summary]) print(result)
此外,访问原始数据(如第0行)进行分析非常直接:
# 获取第0行所有值(返回 Series,含完整 MultiIndex 列名)
row_0 = out.iloc[0]
# 任意统计:按学科大类(level=0)求平均分
avg_by_category = row_0.groupby(level=[0,1,2]).mean() # 或 .sum(), .std()
# 提取 Physics 所有分数并计算均值
physics_scores = row_0.xs('Physics', level=2, drop_level=False)
print(f"Physics avg: {physics_scores.mean():.1f}") # 输出: 99.5总结:
- ❌ 避免 unstack().to_frame().T 后再处理——这会破坏 MultiIndex 层级关系;
- ✅ 优先在 concat 后直接使用 .sum(level=...) 或 .groupby(...).sum() 进行层级聚合;
- ✅ 利用 xs()、groupby(level=...)、iloc[0] 等方法高效提取子集并分析;
- ? 核心原则:MultiIndex 的聚合操作应作用于索引层级本身,而非展开后的平面结构。

















