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

如何在不丢失索引的情况下外连接带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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:57:17