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