在数据分析工作中,我们常会碰到列索引不止一层的情况,例如外层是年份、内层是地区,这种结构称为多级列索引。面对这类数据,按层级聚合与重塑是两项非常实用的操作。

什么是多级列索引
Pandas的DataFrame允许列名是一个元组,从而形成多层列。我们可以通过如下方式构造一个简单示例:
import pandas as pd
# 构造多级列索引数据
cols = pd.MultiIndex.from_tuples([
('2023', '北京'),
('2023', '上海'),
('2024', '北京'),
('2024', '上海')
])
data = [[10, 20, 30, 40], [5, 15, 25, 35]]
df = pd.DataFrame(data, columns=cols)
print(df)
按层级聚合
如果只想按外层年份求和,可以使用sum方法并指定axis=1与level参数:
# 按第一级列索引(年份)聚合求和 year_sum = df.sum(axis=1, level=0) print(year_sum)
同理,按第二级(城市)聚合可设置level=1。若需要平均值,把sum换成mean即可。
使用groupby处理列层级
当层级名较复杂时,也可借助groupby对列做分组:
# 按年份层级分组求均值 result = df.groupby(level=0, axis=1).mean() print(result)
重塑技巧
多级列常需转为长格式以便绘图或入库,这时用stack把列层级压入行:
# 将多级列堆叠为行索引 stacked = df.stack() print(stacked)
反过来,用unstack可将某级行索引还原为列:
# 将最内层行索引展开为列 unstacked = stacked.unstack() print(unstacked)
常见注意事项
- 聚合时注意
axis=1代表对列方向操作 - stack之后会出现多级行索引,可用
reset_index转成普通列 - 缺失值可能在重塑后产生,可用
dropna清理
合理运用层级聚合与重塑,可避免大量手写循环,让数据处理脚本更简洁易维护。