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!
3 Réponses :
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
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]
loc lèvera une KeyError s'il manque un index. la réindexation est plus sûre
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
pd.DataFrame.sub (* df1.align (df2, join = 'left'))
@WeNYoBen, puis-je vous demander pourquoi il y a 0 - df2
? Merci
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)