web-dev-qa-db-fra.com

Comment additionner des valeurs dans une colonne qui correspondent à une condition donnée en utilisant des pandas?

Supposons que j'ai une colonne comme celle-ci:

a   b  
1   5   
1   7
2   3
1   3
2   5

Je veux résumer les valeurs pour ba = 1, par exemple. Cela me donnerait 5 + 7 + 3 = 15.

Comment est-ce que je fais ceci dans les pandas?

47
adijo

L'idée essentielle ici est de sélectionner les données que vous voulez additionner, puis de les additionner. Cette sélection de données peut être effectuée de différentes manières, dont certaines sont présentées ci-dessous.

Indexation booléenne

Le moyen le plus courant de sélectionner les valeurs consiste à utiliser indexation booléenne .

Avec cette méthode, vous découvrez où la colonne 'a' est égale à 1 puis additionnez les lignes correspondantes de la colonne 'b'. Vous pouvez utiliser loc pour gérer l'indexation des lignes et des colonnes:

>>> df.loc[df['a'] == 1, 'b'].sum()
15

L'indexation booléenne peut être étendue à d'autres colonnes. Par exemple, si df contenait également une colonne 'c' et que nous voulions additionner les lignes de 'b' où 'a' valait 1 et 'c' valait 2, nous écririons:

df.loc[(df['a'] == 1) & (df['c'] == 2), 'b'].sum()

Requete

Une autre façon de sélectionner les données consiste à utiliser query pour filtrer les lignes qui vous intéressent, sélectionnez la colonne 'b' puis additionnez:

>>> df.query("a == 1")['b'].sum()
15

Là encore, la méthode peut être étendue pour effectuer des sélections plus complexes des données:

df.query("a == 1 and c == 2")['b'].sum()

Notez que ceci est un peu plus concis que l'approche d'indexation booléenne.

Par groupe

L’approche alternative consiste à utiliser groupby pour scinder le DataFrame en plusieurs parties en fonction de la valeur de la colonne 'a'. Vous pouvez ensuite additionner chaque partie et extraire la valeur additionnée par les 1:

>>> df.groupby('a')['b'].sum()[1]
15

Cette approche sera probablement plus lente que l’indexation booléenne, mais elle est utile si vous souhaitez vérifier les sommes des autres valeurs de la colonne a:

>>> df.groupby('a')['b'].sum()
a
1    15
2     8
66
Alex Riley

Vous pouvez également le faire sans utiliser groupby ou loc. En incluant simplement la condition dans le code. Laissez le nom de dataframe être df. Ensuite, vous pouvez essayer:

df[df['a']==1]['b'].sum()

ou vous pouvez aussi essayer:

sum(df[df['a']==1]['b'])

Une autre solution consiste à utiliser la bibliothèque numpy de python:

import numpy as np
print(np.where(df['a']==1, df['b'],0).sum())
1
Himanshu Poddar