如何在不丢失索引的情况下外连接带MultiIndex的DataFrame?
保留MultiIndex层级的DataFrame外连接方法
问题背景
有两个带MultiIndex的DataFrame,需基于共同索引层级number执行外连接,同时保留所有索引层级(number、letter、color),但直接使用merge会丢失非共同索引层级,需调整实现方式。
环境搭建代码
import pandas as pd tuples1 = [(1,'a'), (1, 'b'), (2, 'a'), (2, 'b')] df1 = pd.DataFrame(data={'x':[1,2,3,4]}, index=pd.MultiIndex.from_tuples(tuples1,names=['number', 'letter'])) tuples2 = [(1, 'red'), (1, 'blue'), (2, 'red'), (2, 'blue')] df2 = pd.DataFrame(data={'y':[10,20,30,40]}, index=pd.MultiIndex.from_tuples(tuples2,names=['number', 'color']))
生成的DataFrame:
x number letter 1 a 1 b 2 2 a 3 b 4 y number color 1 red 10 blue 20 2 red 30 blue 40
当前问题代码及结果
使用以下代码合并后,非共同索引层级letter和color丢失:
merged = df1.merge(df2, on=['number'], how='outer')
得到的结果:
x y number 1 1 10 1 1 20 1 2 10 1 2 20 2 3 30 2 3 40 2 4 30 2 4 40
期望结果:
x y number letter color 1 a red 1 10 blue 1 20 b red 2 10 blue 2 20 2 a red 3 30 blue 3 40 b red 4 30 blue 4 40
解决方案
核心思路是先将MultiIndex的所有层级转为普通列,合并后再重新构建MultiIndex:
# 重置两个DataFrame的索引为列,保留所有层级信息 df1_reset = df1.reset_index() df2_reset = df2.reset_index() # 基于共同索引number执行外连接 merged = df1_reset.merge(df2_reset, on='number', how='outer') # 将number、letter、color重新设置为MultiIndex,并排序索引保证结构规范 merged = merged.set_index(['number', 'letter', 'color']).sort_index()
执行后即可得到符合预期的结果,所有索引层级均被保留。
原理说明
直接使用merge指定on=['number']时,pandas仅将number作为连接键,会自动丢弃两个DataFrame中不属于连接键的索引层级。通过reset_index将所有索引转为列,合并时能完整保留letter和color的信息,最后再通过set_index恢复MultiIndex结构即可。
内容的提问来源于stack exchange,提问作者user91
相关产品推荐
相关产品推荐

