如何在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
相关产品推荐
相关产品推荐

