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

如何在Pandas MultiIndex中合并指定索引层级并保留其他索引值?

合并Pandas MultiIndex的两个层级并保留第三个层级

原始DataFrame

import pandas as pd

data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
index = pd.MultiIndex.from_tuples([('X', 'a', 'I'), ('X', 'b', 'II'), ('Y', 'a', 'III')], names=['Level1', 'Level2', 'Level3'])
df = pd.DataFrame(data, index=index)

输出结果:

A  B
Level1 Level2 Level3      
X      a      I       1  4
       b      II      2  5
Y      a      III     3  6

期望结果

将Level1和Level2用“-”连接为新层级CombinedLevel,同时保留Level3:

A  B
CombinedLevel Level3      
X - a         I        1  4
X - b         II       2  5
Y - a         III      3  6

解决方案

方法一:直接构造新的MultiIndex

通过提取原索引的层级值,合并后构造新的多级索引:

# 提取Level1和Level2的值并合并
combined_level = df.index.get_level_values('Level1') + ' - ' + df.index.get_level_values('Level2')
# 用合并后的值和Level3构造新的MultiIndex
new_index = pd.MultiIndex.from_arrays(
    [combined_level, df.index.get_level_values('Level3')],
    names=['CombinedLevel', 'Level3']
)
# 为DataFrame设置新索引
df = df.set_index(new_index)

方法二:重置索引后处理列

先将索引转为普通列,合并后再重新设置索引:

# 重置索引,将多级索引转为列
df_reset = df.reset_index()
# 合并Level1和Level2为新列
df_reset['CombinedLevel'] = df_reset['Level1'] + ' - ' + df_reset['Level2']
# 设置新的多级索引,并删除多余的列
df_result = df_reset.set_index(['CombinedLevel', 'Level3']).drop(columns=['Level1', 'Level2'])

两种方法都能得到目标结果,可避免之前操作中因索引层级名称不匹配或索引操作不当导致的KeyError问题。

内容的提问来源于stack exchange,提问作者jeeples

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:08:11