如何在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
相关产品推荐
相关产品推荐

