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

如何在pandas中连接层级数不同的MultiIndex DataFrame

如何在Pandas中连接层级数不同的MultiIndex DataFrame

这是Pandas处理多级索引时很常见的场景,我来给你详细讲解通用的解决方法,不管两个MultiIndex的层级差异多大都能轻松应对:

示例1:单层级索引连接(两级索引 vs 一级索引)

针对你第一个示例里的情况,我们需要把t1的a1索引层级和t2的b1索引做连接,同时保留t1原来的两级索引结构。可以这么做:

import pandas as pd

t1 = pd.DataFrame(data={'a1':[0,0,1,1,2,2], 'a2':[0,1,0,1,0,1], 'x':[1.,2.,3.,4.,5.,6.]})
t1.set_index(['a1','a2'], inplace=True)
t1.sort_index(inplace=True)

t2 = pd.DataFrame(data={'b1':[0,1,2], 'y':[20.,40.,60.]})
t2.set_index(['b1'], inplace=True)
t2.sort_index(inplace=True)

# 核心操作:拆分索引→连接→恢复索引
result = (t1.reset_index('a2')  # 把不需要连接的a2临时转成列
          .merge(t2, left_on='a1', right_index=True)  # 用a1和t2的索引连接
          .set_index('a2', append=True)  # 把a2重新设为索引
          .sort_index())  # 保持索引排序一致

print(result)

输出和你预期的完全一致:

x     y
a1 a2           
0  0   1.0  20.0
   1   2.0  20.0
1  0   3.0  40.0
   1   4.0  40.0
2  0   5.0  60.0
   1   6.0  60.0

示例2:多层级索引连接(三级索引 vs 两级索引)

第二个示例需要用t1的a1、a2两个层级对应t2的b1、b2,操作逻辑和上面一致,只是连接键变成了多个:

import pandas as pd, numpy as np

t1 = pd.DataFrame(data={'a1':[0,0,0,0,1,1,1,1,2,2,2,2], 'a2':[3,3,4,4,3,3,4,4,3,3,4,4], 'a3':[7,8,7,8,7,8,7,8,7,8,7,8], 'x':[1.,2.,3.,4.,5.,6.,7.,8.,9.,10.,11.,12.]})
t1.set_index(['a1','a2','a3'], inplace=True)
t1.sort_index(inplace=True)

t2 = pd.DataFrame(data={'b1':[0,0,1,1,2,2], 'b2':[3,4,3,4,3,4], 'y':[10.,20.,30.,40.,50.,60.]})
t2.set_index(['b1','b2'], inplace=True)
t2.sort_index(inplace=True)

# 多键连接的核心操作
result = (t1.reset_index('a3')
          .merge(t2, left_on=['a1','a2'], right_index=True)
          .set_index('a3', append=True)
          .sort_index())

print(result)

输出符合预期:

x     y
a1 a2 a3           
0  3  7    1.0  10.0
      8    2.0  10.0
   4  7    3.0  20.0
      8    4.0  20.0
1  3  7    5.0  30.0
      8    6.0  30.0
   4  7    7.0  40.0
      8    8.0  40.0
2  3  7    9.0  50.0
      8   10.0  50.0
   4  7   11.0  60.0
      8   12.0  60.0

通用解决方案总结

不管两个MultiIndex的层级数差多少,都可以遵循这个通用流程:

  1. 拆分索引:用reset_index把左侧DataFrame中不需要作为连接键的索引层级转成列,只保留需要连接的层级(或者也可以把所有索引都转成列,之后用left_on指定连接键)
  2. 执行连接:用merge方法,通过left_on指定左侧的连接键(支持单个或多个层级/列名),right_index=True表示用右侧的索引作为连接键;如果右侧的连接键是列,就用right_on对应指定
  3. 恢复索引:把之前临时转成列的层级重新设置为索引,再用sort_index保证顺序和原DataFrame一致

如果你的连接键本身就是普通列而不是索引,那更简单——直接用merge的left_on和right_on指定对应列名就行,完全不用碰索引~

内容的提问来源于stack exchange,提问作者S.V

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:43:45