如何在不合并索引的情况下连接具有不同多索引的两个数据帧?

Posted

技术标签:

【中文标题】如何在不合并索引的情况下连接具有不同多索引的两个数据帧?【英文标题】:How can I concatenate two dataframes with different multi-indexes without merging indexes? 【发布时间】:2020-05-27 10:51:31 【问题描述】:

我有两个数据框。每个都有一个两级多索引。每个级别的第一级相同,但第二级不同。我想连接数据帧并最终得到一个具有三级多索引的数据帧,其中第一个数据帧的记录在第三个索引级别将具有“NaN”,而来自第二个数据帧的记录将具有“NaN”在第二个索引级别。相反,我得到一个具有两级索引的数据帧,其中每个数据帧的第二级中的值都放在相同的索引级别中,它采用第一个数据帧中第二级的名称(参见下面的代码)。

有什么好的方法可以做到这一点吗?我可以将每个索引的第二级变成一列,连接起来,然后将它们放回索引中,但这对我来说似乎是一种迂回的方式。

df1 = pd.DataFrame('index-1':['a1','b1','c1','d1'], 'index-2':['a2','b2','c2','d2'], 'values':[1,2,3,4])
df2 = pd.DataFrame('index-1':['a1','b1','c1','d1'], 'index-3':['a3','b3','c3','d3'], 'values':[5,6,7,8])

df1.set_index(['index-1','index-2'], inplace=True)
df2.set_index(['index-1','index-3'], inplace=True)

pd.concat([df1, df2])

谢谢!

【问题讨论】:

【参考方案1】:

重置两个输入数据帧的索引,连接它们然后再次设置索引会更容易:

pd.concat([df1.reset_index(), df2.reset_index()], sort=False) \
    .set_index(['index-1', 'index-2', 'index-3'])

结果:

                         values
index-1 index-2 index-3        
a1      a2      NaN           1
b1      b2      NaN           2
c1      c2      NaN           3
d1      d2      NaN           4
a1      NaN     a3            5
b1      NaN     b3            6
c1      NaN     c3            7
d1      NaN     d3            8

【讨论】:

以上是关于如何在不合并索引的情况下连接具有不同多索引的两个数据帧?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改熊猫数据框中多索引的外层索引?

具有可迭代对象的字典字典到具有多索引的可迭代对象索引的熊猫数据框

Pandas groupby(),agg() - 如何在没有多索引的情况下返回结果?

如何在熊猫中使用具有多索引的地图?

在写入Excel时,“解析”一个pandas多索引

如何为与python中列的最大值对应的多索引的每个级别返回索引