reset_index()是最直接的多级索引转普通列方法:默认拆解所有层级并生成整数索引;可用level参数指定部分层级;支持rename或列表推导式重命名;建议先设索引名避免level_0等默认名。

用 reset_index() 就能快速把多级索引转成普通列,这是最直接、最常用的方法。
直接用 reset_index() 拆解所有层级
默认情况下,reset_index() 会把所有索引层级都变成普通列,并生成新的整数索引:
df_flat = df.reset_index()
如果原 DataFrame 有两级索引(比如 year 和 category),执行后这两列会自动出现在最左边,名称保持不变。
只扁平化部分索引层级
如果只想展开其中几层,可以用 level 参数指定层级名或位置:
-
按名称:
df.reset_index(level=['year', 'region']) -
按位置:
df.reset_index(level=[0, 2])
未指定的层级仍保留在索引中,适合逐步处理复杂索引结构。
重命名扁平化后的列名
扁平化后列名可能和原有索引名重复,或层级名含元组(如多级列索引嵌套时),可配合 rename() 或 columns 直接调整:
-
简单重命名:
df.reset_index().rename(columns={'level_0': 'year', 'level_1': 'type'}) -
批量清理列名(去掉元组):
df_flat.columns = ['_'.join(col).strip() if isinstance(col, tuple) else col for col in df_flat.columns]
避免索引名冲突的小技巧
如果某层索引没有名字(name is None),reset_index() 会默认生成 level_0、level_1 这样的列名。提前设好索引名更清晰:
df.index.names = ['year', 'category'] # 先命名再 reset_index
这样扁平化后列名就是可读的 year 和 category,无需额外重命名。










