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

如何在Pandas连接操作中保留MultiIndex的原有顺序?

解决Pandas左连接后多级索引顺序错乱的问题

问题原因

当用join连接不同层级的索引时,Pandas会自动把用于连接的索引列提升到最外层,哪怕设置sort=False也不会保留原DataFrame的索引层级顺序。这里df1的索引是[index1, Index2],df2的索引是Index2,连接时Pandas会把Index2放到最前面,导致结果不符合预期。

解决方案

有两种简单方法可以恢复原索引顺序:

方法1:用merge替代join

merge能更精准控制索引保留逻辑,指定left_index=True和right_index=True,连接后再重置索引顺序:

import pandas as pd

df1 = pd.DataFrame({'data1':[1,2,3,4]}, index=pd.MultiIndex.from_product([['a','b'],[1,2],], names=['index1','Index2']))
df2 = pd.DataFrame({'data2':[5,6]}, index=pd.MultiIndex.from_product([[1,2]], names=['Index2']))

# 使用merge完成连接
df3 = pd.merge(df1, df2, left_index=True, right_index=True, how='left')
# 按照df1的索引层级顺序重排
df3 = df3.reorder_levels(df1.index.names)
print(df3)

输出结果:

data1  data2
index1 Index2              
a      1           1      5
       2           2      6
b      1           3      5
       2           4      6

方法2:连接后直接重排索引层级

如果坚持用join,可以在连接完成后用reorder_levels把索引改回原顺序:

df3 = df1.join(df2, how='left', sort=False)
# 按照df1的索引名称顺序重排层级
df3 = df3.reorder_levels(df1.index.names)
print(df3)

同样能得到符合预期的结果。

补充说明

Pandas文档中how='left'保留原索引的描述,指的是保留原索引的内容,而非索引的层级顺序。当连接用的索引在原DataFrame中不是最外层时,就会出现层级顺序被调换的情况,用上述方法即可解决。

内容的提问来源于stack exchange,提问作者Sandwichnick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:27:12