熊猫重新索引MultiIndex数据框

Bra*_*adB 6 multi-index dataframe pandas

有没有一种方法可以对两个(不同级别的)数据框重新编制索引,以使它们在所有级别上共享相同的索引?

演示:

创建一个名为“ A”的基本数据框:

index = np.array(['AUD','BRL','CAD','EUR','INR'])
data = np.random.randint(1, 20, (5,5))
A = pd.DataFrame(data=data, index=index, columns=index)  
Run Code Online (Sandbox Code Playgroud)

创建一个名为“ B”的MultiIndex Dataframe:

np.random.seed(42)
midx1 = pd.MultiIndex.from_product([['Bank_1', 'Bank_2'], 
['AUD','CAD','EUR']], names=['Bank', 'Curency'])
B = pd.DataFrame(np.random.randint(10,25,6), midx1)
B.columns = ['Notional']
Run Code Online (Sandbox Code Playgroud)

基本DF:

>>> Dataframe A:

        AUD     BRL     CAD     EUR     INR
AUD     7       19      11      11      4
BRL     8       3       2       12      6
CAD     2       1       12      12      17
EUR     10      16      15      15      19
INR     12      3       5       19      7
Run Code Online (Sandbox Code Playgroud)

MultiIndex DF:

>>> Dataframe B:

                    Notional
Bank    Curency     
Bank_1  AUD         16
        CAD         13
        EUR         22
Bank_2  AUD         24
        CAD         20
        EUR         17
Run Code Online (Sandbox Code Playgroud)

目标是:

1)重新索引B,使其货币水平包括A的索引中的每种货币。B会看起来像这样(请参阅BRL和INR,它们的名义值并不重要):

                    Notional
Bank    Curency     
Bank_1  AUD         16
        CAD         13
        EUR         22
        BRL         0
        INR         0
Bank_2  AUD         24
        CAD         20
        EUR         17
        BRL         0
        INR         0
Run Code Online (Sandbox Code Playgroud)

2)重新索引A,以便它包括B索引的第一级中的每个Bank。然后,A将如下所示:

               AUD      BRL     CAD     EUR     INR
Bank_1  AUD     7       19      11      11      4
        BRL     8       3       2       12      6
        CAD     2       1       12      12      17
        EUR     10      16      15      15      19
        INR     12      3       5       19      7
Bank_2  AUD     7       19      11      11      4
        BRL     8       3       2       12      6
        CAD     2       1       12      12      17
        EUR     10      16      15      15      19
        INR     12      3       5       19      7
Run Code Online (Sandbox Code Playgroud)

该应用程序将在更大的数据帧上使用,因此我需要一种pythonic方式来执行此操作。

对于上下文,最终我想乘以A和B。我试图重新索引以获取匹配的索引,因为这是在此处乘以各种索引级别的数据框的一种干净方法: 熊猫将具有多重索引和重叠索引级别的数据框相乘

感谢您的任何帮助。

WeN*_*Ben 9

要使用B reindex

B.reindex( pd.MultiIndex.from_product([B.index.levels[0], 
A.index], names=['Bank', 'Curency']),fill_value=0)

Out[62]: 
                Notional
Bank   Curency          
Bank_1 AUD            16
       BRL             0
       CAD            13
       EUR            22
       INR             0
Bank_2 AUD            24
       BRL             0
       CAD            20
       EUR            17
       INR             0
Run Code Online (Sandbox Code Playgroud)

要使用A concat

pd.concat([A]*2,keys=B.index.levels[0])
Out[69]: 
            AUD  BRL  CAD  EUR  INR
Bank                               
Bank_1 AUD   10    5   10   14    1
       BRL   17    1   14   10    8
       CAD    3    7    3   15    2
       EUR   17    1   15    2   16
       INR    7   15    6    7    4
Bank_2 AUD   10    5   10   14    1
       BRL   17    1   14   10    8
       CAD    3    7    3   15    2
       EUR   17    1   15    2   16
       INR    7   15    6    7    4
Run Code Online (Sandbox Code Playgroud)

  • 同样,您可以使用`get_level_values`,而不是像[B.index.get_level_values(0).unique()这样的硬编码['Bank_1','Bank_2']。 (3认同)