在单一级别的MultiIndex上合并

发布于 2021-01-29 15:08:54

有什么方法可以在不重置索引的情况下在MultiIndex的单个级别上进行合并?

我有一个由ObjectID索引的时不变值的“静态”表,而我有一个由ObjectID + Date索引的时变字段的“动态”表。我想将这些表连接在一起。

现在,我能想到的最好的是:

dynamic.reset_index().merge(static, left_on=['ObjectID'], right_index=True)

但是,动态表非常大,我不想为了合并值而随意修改其索引。

关注者
0
被浏览
78
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    是的,从pandas 0.14.0开始,现在可以使用将单个索引的DataFrame与多索引的DataFrame级别合并.join

    df1.join(df2, how='inner') # how='outer' keeps all records from both data frames
    

    0.14 pandas文档将其描述为等效的,但比以下方法具有更高的内存效率和更快的内存:

    merge(df1.reset_index(),
          df2.reset_index(),
          on=['index1'],
          how='inner'
         ).set_index(['index1','index2'])
    

    文档还提到.join不能用于在单个级别上合并两个多索引的DataFrame,并且从上一期的GitHub跟踪器讨论中可以看出,实现此优先级似乎不高:

    所以我合并为单个联接,请参见#6363; 以及有关如何进行多-
    多联接的一些文档。实际实现起来相当复杂。和恕我直言,不值得付出努力,因为它实际上根本不会改变太多的内存使用/速度。

    但是,与此相关的是GitHub对话,最近有一些开发https://github.com/pydata/pandas/issues/6360。也可以通过重置索引来实现此目的,如前所述,文档中也有描述。


    熊猫更新> = 0.24.0

    现在可以将多索引数据帧彼此合并。根据发行说明

    index_left = pd.MultiIndex.from_tuples([('K0', 'X0'), ('K0', 'X1'),
                                            ('K1', 'X2')],
                                            names=['key', 'X'])
    
    left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                         'B': ['B0', 'B1', 'B2']}, index=index_left)
    
    index_right = pd.MultiIndex.from_tuples([('K0', 'Y0'), ('K1', 'Y1'),
                                            ('K2', 'Y2'), ('K2', 'Y3')],
                                            names=['key', 'Y'])
    
    right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
                          'D': ['D0', 'D1', 'D2', 'D3']}, index=index_right)
    
    left.join(right)
    

    出:

                A   B   C   D
    key X  Y                 
    K0  X0 Y0  A0  B0  C0  D0
        X1 Y0  A1  B1  C0  D0
    K1  X2 Y1  A2  B2  C1  D1
    
    [3 rows x 4 columns]
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看