pandas 与 MultiIndex 合并,当只有一级索引用作键时

Posted

技术标签:

【中文标题】pandas 与 MultiIndex 合并,当只有一级索引用作键时【英文标题】:pandas merge with MultiIndex, when only one level of index is to be used as key 【发布时间】:2015-01-30 19:27:23 【问题描述】:

我有一个名为 df1 的数据框,它具有 2 级 MultiIndex(级别:'_Date' 和 _'ItemId')。 '_ItemId' 的每个值都有多个实例,如下所示:

                              _SomeOtherLabel
 _Date            _ItemId     
 2014-10-05       6588921     AA
                  6592520     AB 
                  6836143     BA
 2014-10-11       6588921     CA
                  6592520     CB
                  6836143     DA 

我有一个名为 df2 的第二个数据框,其中“_ItemId”用作键(不是索引)。在这个df中,_ItemId的每个值只出现一次:

                  _ItemId       _Cat
  0               6588921       6_1
  1               6592520       6_1
  2               6836143       7_1

我想从 df2 恢复“_Cat”列中的值并将它们合并到 df1 中以获得“_ItemId”的适当值。这几乎是(我认为?)一个标准的多对一合并,除了左侧 df 的适当键是 MultiIndex 级别之一。我试过这个:

df1['_cat']=pd.merge(df1,df2,left_index=True, right_on='ItemId')  

但我得到了错误

   "ValueError: len(right_on) must equal the number of levels in the index of "left"

我认为这是有道理的,因为我的(左)索引实际上是由两个键组成的。如何选择我需要的一个索引级别?还是有更好的合并方法?

谢谢

【问题讨论】:

【参考方案1】:

我可以想到两种方法。

使用set_index()join()

>>> df1.join(df2.set_index('_ItemId'))
                   _SomeOtherLabel _Cat
_Date      _ItemId                     
2014-10-05 6588921              AA  6_1
           6592520              AB  6_1
           6836143              BA  7_1
2014-10-11 6588921              CA  6_1
           6592520              CB  6_1
           6836143              DA  7_1

或者使用reset_index(),merge()然后设置新的多索引

我认为第一种方法应该更快,但不确定。

【讨论】:

以上是关于pandas 与 MultiIndex 合并,当只有一级索引用作键时的主要内容,如果未能解决你的问题,请参考以下文章

合并 pandas MultiIndex 很慢

合并两个 pandas.core.indexes.multi.MultiIndex

在 Pandas 中将两个 MultiIndex 级别合并为一个

合并pandas DataFrames时如何保留列MultiIndex值

Pandas 将 CSV 中的 SingleIndex 合并到 MultiIndex

在 pandas MultiIndex DataFrame 中按级别求和列