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

Pandas合并DataFrame时保留Multi Index的实现方法

保留多级索引的Pandas DataFrame合并方法

我偏爱Pandas的多级索引(Multi Index),但不少Pandas函数必须折叠索引才能运行,这是我最头疼的问题——官方文档总是把重心放在单索引数据框上。现在我需要基于Postcode字段合并两个DataFrame,但不想走重置索引→合并→重建索引的流程,因为这样会丢掉原有的多级索引。

试了pd.merge(df1, df2, on='Postcode', how='left'),结果多级索引没保住。

示例数据

import pandas as pd

df1 = pd.DataFrame(data={'Postcode' : ["", "", 'A1 1UU', 'G1 2EE', "", "", 'EF2 5GG', "", ""] }, 
                    index=[[1,1,1,2,2,2,3,3,3,], 
                            ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C']])

df2 = pd.DataFrame(data={'Postcode' : ['A1 1UU', 'G1 2EE', 'EF2 5GG',],
                   "Map Position" : ["51.499767, -0.127262", 
                                     "51.500923, -0.124628", 
                                     "51.503195, -0.118710"]})

期望结果

pd.DataFrame(data={'Postcode' : ["", "", 'A1 1UU', 'G1 2EE', "", "", 'EF2 5GG', "", ""], 
                   "Map Position" : ["", "", "51.499767, -0.127262", 
                                     "51.500923, -0.124628", "", "", 
                                     "51.503195, -0.118710", "", ""]}, 
                    index=[[1,1,1,2,2,2,3,3,3,], 
                            ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C']])

解决办法

用DataFrame.join()替代pd.merge(),先把df2的索引设为Postcode,再关联df1的Postcode字段,这样能完整保留df1的多级索引:

result = df1.join(df2.set_index('Postcode'), on='Postcode')

说明

  • df2.set_index('Postcode'):将df2的索引替换为Postcode字段,使其成为可用于关联的键
  • df1.join(..., on='Postcode'):指定用df1的Postcode字段匹配df2的索引,该方法默认保留df1的原有索引(包括多级索引)——这是它和merge的核心区别,merge默认会重新生成索引,而join以左侧DataFrame的索引为基准。

运行上述代码后,结果完全符合预期,多级索引完整保留,Map Position字段也正确匹配填充了对应值与空值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:22:40