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

