1
votes

Les pandas calculent la différence sur deux DataFrames avec colonne et multi-indices

J'ai 2 DataFrames, df1 est:

ID   Name        Jan17  Jun18    Dec18    Apr19  
 0   Nick         5.0      0      1.7      0    
 1   Jack         4.0      0      2.0      0              
 2   Fox          2.0      -3.3   0        0    
 3   Rex          0        0      2.0      0  

le deuxième DataFrame - df2 est:

          Jan17  Jun18  Dec18  Apr19
ID Name                             
0  Nick     5.0    1.7    2.0    0.0
1  Jack     6.0    0.0    0.8    3.5
2  Fox      8.0    5.0    0.0    0.0
3  Rex      1.0    0.0    1.0    4.2
4  Snack    3.1    9.0    2.8    4.4
5  Yosee    4.3    0.0    0.0    4.3
6  Petty    0.5    1.3    2.8    3.5
7  Lind     3.6    7.5    2.8    4.3
8  Korr     0.6    1.5    1.8    2.3

Le résultat est df3:

         Jan17  Jun18  Dec18  Apr19
ID Name                            
0  Nick   10.0    1.7    3.7    0.0
1  Jack   10.0    0.0    2.8    3.5
2  Fox    10.0    1.7    0.0    0.0
3  Rex     1.0    0.0    3.0    4.2

Comment calculer les différences entre les colonnes dans df1 et df2 basé sur des multi-indices: [ID, Name] de df1 et enregistrer le résultat dans le df3 ?

J'apprécierais pour toute idée. Merci!


2 commentaires

L'ID et le nom sont-ils déjà définis comme index de leurs cadres de données respectifs?


@ cs95, oui, je l'ai défini par df1.set_index (['ID', 'Name'], inplace = True) , df2.set_index (['ID', 'Name' ], inplace = True)


3 Réponses :


2
votes

Il suffit de soustraire, la soustraction est alignée sur l'index. Vous pouvez réindexer df2 avant de soustraire pour éviter les NaN:

df2.reindex(df1.index, fill_value=0)

         Jan17  Jun18  Dec18  Apr19
ID Name                            
0  Nick    5.0    1.7    2.0    0.0
1  Jack    6.0    0.0    0.8    3.5
2  Fox     8.0    5.0    0.0    0.0
3  Rex     1.0    0.0    1.0    4.2

Notez que la raison pour laquelle je suis allé pour réindexer sur loc code> était d'éviter les KeyError s s'il manque des valeurs d'index.

Dans l'instance ci-dessus, la première solution produira des NaN, vous pouvez donc spécifier fill_values ​​ code> à réindexer pour vous assurer que la valeur de df1 est renvoyée (plutôt que NaN):

# df1 - df2.reindex(df1.index)
df1.sub(df2.reindex(df1.index))

         Jan17  Jun18  Dec18  Apr19
ID Name                            
0  Nick    5.0    0.0    1.7    0.0
1  Jack    4.0    0.0    2.0    0.0
2  Fox     2.0   -3.3    0.0    0.0
3  Rex     0.0    0.0    2.0    0.0


0 commentaires

2
votes

Vous pouvez simplement faire

         Jan17  Jun18  Dec18  Apr19
ID Name                            
0  Nick    5.0    0.0    1.7    0.0
1  Jack    4.0    0.0    2.0    0.0
2  Fox     2.0   -3.3    0.0    0.0
3  Rex     0.0    0.0    2.0    0.0

Sortie:

df1-df2.loc[df1.index]


1 commentaires

loc lèvera une KeyError s'il manque un index. la réindexation est plus sûre



1
votes

Essayez quelque chose de nouveau

sum(df1.align(0-df2,join='left'))
Out[282]: 
         Jan17  Jun18  Dec18  Apr19
ID Name                            
0  Nick    5.0    0.0    1.7    0.0
1  Jack    4.0    0.0    2.0    0.0
2  Fox     2.0   -3.3    0.0    0.0
3  Rex     0.0    0.0    2.0    0.0


2 commentaires

pd.DataFrame.sub (* df1.align (df2, join = 'left'))


@WeNYoBen, puis-je vous demander pourquoi il y a 0 - df2 ? Merci