如何在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的层级数差多少,都可以遵循这个通用流程:
- 拆分索引:用
reset_index把左侧DataFrame中不需要作为连接键的索引层级转成列,只保留需要连接的层级(或者也可以把所有索引都转成列,之后用left_on指定连接键) - 执行连接:用
merge方法,通过left_on指定左侧的连接键(支持单个或多个层级/列名),right_index=True表示用右侧的索引作为连接键;如果右侧的连接键是列,就用right_on对应指定 - 恢复索引:把之前临时转成列的层级重新设置为索引,再用
sort_index保证顺序和原DataFrame一致
如果你的连接键本身就是普通列而不是索引,那更简单——直接用merge的left_on和right_on指定对应列名就行,完全不用碰索引~
内容的提问来源于stack exchange,提问作者S.V
相关产品推荐
相关产品推荐

