首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重新索引MultiIndex数据

如何重新索引MultiIndex数据
EN

Stack Overflow用户
提问于 2018-11-13 17:53:30
回答 1查看 27.3K关注 0票数 29

是否有一种方法可以重新索引两个数据(不同级别),以便它们在所有级别上共享一个公共索引?

演示:

创建一个名为“A”的基本Dataframe:

代码语言:javascript
复制
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)  

创建一个名为‘B’的MultiIndex Dataframe:

代码语言:javascript
复制
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']

基本DF:

代码语言:javascript
复制
>>> 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

MultiIndex DF:

代码语言:javascript
复制
>>> Dataframe B:

                    Notional
Bank    Curency     
Bank_1  AUD         16
        CAD         13
        EUR         22
Bank_2  AUD         24
        CAD         20
        EUR         17

目标是:

1)重新索引B,使其货币水平包括A的指数中的每一种货币。B则如下所示(包括BRL和INR,它们的名义值并不重要):

代码语言:javascript
复制
                    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

2)重新索引A,使其从B指数的第一级中包含每个银行。然后A看起来是这样的:

代码语言:javascript
复制
               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

这方面的应用将是在更大的数据,所以我需要一种pythonic的方式来做到这一点。

对于上下文,我最终希望将A和B相乘。我试图重新编制索引以获得匹配的索引,因为这是一种将不同索引级别的数据相乘的干净方法:Pandas multiply dataframes with multiindex and overlapping index levels

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-13 18:00:51

使用reindex获取B

代码语言:javascript
复制
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

使用concat获取A

代码语言:javascript
复制
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
票数 40
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53286882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档