pandas 如何把多级索引快速扁平化为普通列

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_0level_1 这样的列名。提前设好索引名更清晰:

df.index.names = ['year', 'category']  # 先命名再 reset_index

这样扁平化后列名就是可读的 yearcategory,无需额外重命名。