Existe-t-il un moyen de compter le nombre d'occurrences de valeurs booléennes dans une colonne sans avoir à parcourir le DataFrame?
Faire quelque chose comme
df[df["boolean_column"]==False]["boolean_column"].sum()
Ne fonctionnera pas car False a une valeur de 0, donc une somme de zéros retournera toujours 0.
Évidemment, vous pouvez compter les occurrences en faisant une boucle sur la colonne et en vérifiant, mais je voulais savoir s'il y avait une façon Pythonique de le faire.
Utilisez pd.Series.value_counts()
:
>> df = pd.DataFrame({'boolean_column': [True, False, True, False, True]})
>> df['boolean_column'].value_counts()
True 3
False 2
Name: boolean_column, dtype: int64
Si vous voulez compter False
et True
séparément, vous pouvez utiliser pd.Series.sum()
+ ~
:
>> df['boolean_column'].values.sum() # True
3
>> (~df['boolean_column']).values.sum() # False
2
Vous pouvez simplement résumer:
sum(df["boolean_column"])
Ceci trouvera le nombre d'éléments "vrais".
len(df["boolean_column"]) - sum(df["boolean_column"])
Donne le nombre d'éléments "faux".
Avec Pandas, la manière naturelle utilise value_counts
:
df = pd.DataFrame({'A': [True, False, True, False, True]})
print(df['A'].value_counts())
# True 3
# False 2
# Name: A, dtype: int64
Pour calculer True
ou False
séparément, ne comparez pas avec True
/False
explicitement, juste sum
et prenez le booléen inverse via ~
pour compter False
valeurs:
print(df['A'].sum()) # 3
print((~df['A']).sum()) # 2
Cela fonctionne car bool
est une sous-classe de int
, et le comportement est également vrai pour Pandas series/NumPy array).
Alternativement, vous pouvez calculer les nombres en utilisant NumPy:
print(np.unique(df['A'], return_counts=True))
# (array([False, True], dtype=bool), array([2, 3], dtype=int64))
Cette alternative fonctionne également pour plusieurs colonnes et/ou lignes.
df[df==True].count(axis=0)
Vous obtiendrez le montant total de True
valeurs par colonne. Pour un comptage par ligne, définissez axis=1
.
df[df==True].count().sum()
L'ajout d'une sum()
à la fin vous obtiendra le montant total dans l'ensemble du DataFrame.
Dans le cas où vous avez une colonne dans un DataFrame avec des valeurs booléennes, ou encore plus intéressant, dans le cas où vous ne l'avez pas mais que vous voulez trouver le nombre de valeurs dans une colonne remplissant une certaine condition, vous pouvez essayer quelque chose comme ça (en tant que exemple j'ai utilisé <=):
(df['col']<=value).value_counts()
les parenthèses créent un Tuple avec # de valeurs True/False que vous pouvez également utiliser pour d'autres calculs, en accédant au Tuple en ajoutant [0] pour les faux comptes et [1] pour les vrais nombres même sans créer de variable supplémentaire:
(df['col']<=value).value_counts()[0] #for falses
(df['col']<=value).value_counts()[1] #for trues