web-dev-qa-db-fra.com

Comment réindexer une trame de données MultiIndex

Existe-t-il un moyen de réindexer deux trames de données (de niveaux différents) afin qu'elles partagent un index commun à tous les niveaux?

Démo:

Créez un Dataframe de base nommé '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)  

Créez un cadre de données MultiIndex nommé 'B':

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 de base:

>>> 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:

>>> Dataframe B:

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

Le but est de:

1) réindexer B pour que son niveau de devise inclue chaque devise dans l'indice de A. B ressemblerait alors à ceci (voir BRL et INR inclus, leurs valeurs notionnelles ne sont pas importantes):

                    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) réindexer A afin qu'il inclue chaque banque du premier niveau de l'indice de B. A ressemblerait alors à ceci:

               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

L'application de ceci sera sur des cadres de données beaucoup plus grands, j'ai donc besoin d'une méthode Pythonic pour le faire.

Pour le contexte, en fin de compte, je veux multiplier A et B.J'essaie de réindexer pour obtenir des indices correspondants, comme cela a été montré comme un moyen propre de multiplier les trames de données de différents niveaux d'index ici: Les pandas multiplient les trames de données avec plusieurs index et index se chevauchant) niveaux

Merci pour toute aide.

9
BradB

Pour obtenir le B en utilisant 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

Pour obtenir le A en utilisant 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
14
YOBEN_S