
Cet article décrit comment compter les éléments qui satisfont à certaines conditions dans pandas.DataFrame et pandas.Series.
- Comment compter les éléments qui satisfont la condition
- AND, OR, NOT pour plusieurs conditions
- Compter par conditions sur les nombres
- Compter par conditions sur les chaînes
- Comptez NaN et nommez NaN
Consultez l’article suivant pour savoir comment extraire les lignes qui satisfont aux conditions.
Utilisez le fichier CSV suivant comme exemple.
import pandas as pd
print(pd.__version__)
# 1.4.1
df = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df)
# name age state point
# 0 Alice 24 NY 64
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 3 Dave 68 TX 70
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57
Comment compter les éléments qui satisfont la condition
La procédure de comptage des éléments remplissant certaines conditions est la suivante :
- Obtenez pandas.DataFrame et pandas.Series de type booléen
- Compter True avec la méthode sum()
- pandas.DataFrame
- Compter par colonne :
sum() - Compter par ligne :
sum(axis=1) - Comptez le total :
sum().sum() or values.sum()
- Compter par colonne :
- pandas.Série
- pandas.DataFrame
pandas.DataFrame
En appliquant l’opérateur de comparaison à pandas.DataFrame et pandas.Series, chaque élément est comparé, et pandas.DataFrame et pandas.Series de type booléen (True, False) de même taille sont renvoyés.
Les parenthèses () sur le côté droit peuvent être omises.
df_bool = (df == 'CA')
print(df_bool)
# name age state point
# 0 False False False False
# 1 False False True False
# 2 False False True False
# 3 False False False False
# 4 False False True False
# 5 False False False False
Étant donné que True est considéré comme 1 et que False est considéré comme 0 en Python, vous pouvez obtenir le nombre d’éléments qui satisfont la condition avec la méthode sum().
Par défaut, il compte par colonne, et avec axe=1, il compte par ligne.
print(df_bool.sum())
# name 0
# age 0
# state 3
# point 0
# dtype: int64
print(df_bool.sum(axis=1))
# 0 0
# 1 1
# 2 1
# 3 0
# 4 1
# 5 0
# dtype: int64
sum() de pandas.DataFrame renvoie pandas.Series. Vous pouvez obtenir le nombre total en appelant sum() de pandas.Series.
print(df_bool.sum().sum())
# 3
Vous pouvez convertir pandas.DataFrame en tableau NumPy numpy.ndarray avec l’attribut values.
La méthode sum() de numpy.ndarray calcule le nombre total par défaut. Ainsi, vous pouvez obtenir le nombre total d’éléments qui satisfont la condition en appelant sum() à partir de l’attribut values (numpy.ndarray).
print(df_bool.values)
# [[False False False False]
# [False False True False]
# [False False True False]
# [False False False False]
# [False False True False]
# [False False False False]]
print(type(df_bool.values))
# <class 'numpy.ndarray'>
print(df_bool.values.sum())
# 3
Vous pouvez écrire comme suit :
print((df == 'CA').sum())
# name 0
# age 0
# state 3
# point 0
# dtype: int64
print((df == 'CA').sum(axis=1))
# 0 0
# 1 1
# 2 1
# 3 0
# 4 1
# 5 0
# dtype: int64
print((df == 'CA').sum().sum())
# 3
print((df == 'CA').values.sum())
# 3
pandas.Série
Utilisez les pandas.Series suivants.
s = df['age']
print(s)
# 0 24
# 1 42
# 2 18
# 3 68
# 4 24
# 5 30
# Name: age, dtype: int64
La procédure est la même que pour pandas.DataFrame. Les séries sont des données unidimensionnelles, donc la méthode sum() renvoie le nombre total.
s_bool = (s < 25)
print(s_bool)
# 0 True
# 1 False
# 2 True
# 3 False
# 4 True
# 5 False
# Name: age, dtype: bool
print(s_bool.sum())
# 3
print((s < 25).sum())
# 3
Si vous souhaitez compter les éléments qui satisfont à la condition d’une ligne ou d’une colonne, vous pouvez faire de même en spécifiant la ligne ou la colonne avec [], loc[] ou iloc[].
AND, OR, NOT pour plusieurs conditions
Pour combiner plusieurs conditions, placez chaque expression conditionnelle entre parenthèses () et utilisez les opérateurs suivants.
df_bool_or = ((df == 'CA') | (df == 70))
print(df_bool_or)
# name age state point
# 0 False False False False
# 1 False False True False
# 2 False False True True
# 3 False False False True
# 4 False False True False
# 5 False False False False
print(df_bool_or.sum())
# name 0
# age 0
# state 3
# point 2
# dtype: int64
print(df_bool_or.sum(axis=1))
# 0 0
# 1 1
# 2 2
# 3 1
# 4 1
# 5 0
# dtype: int64
print(df_bool_or.values.sum())
# 5
df_bool_not = ~(df == 'CA')
print(df_bool_not)
# name age state point
# 0 True True True True
# 1 True True False True
# 2 True True False True
# 3 True True True True
# 4 True True False True
# 5 True True True True
print(df_bool_not.sum())
# name 6
# age 6
# state 3
# point 6
# dtype: int64
print(df_bool_not.sum(axis=1))
# 0 4
# 1 3
# 2 3
# 3 4
# 4 3
# 5 4
# dtype: int64
print(df_bool_not.values.sum())
# 21
s_bool_and = ((df['state'] == 'CA') & (df['age'] < 30))
print(s_bool_and)
# 0 False
# 1 False
# 2 True
# 3 False
# 4 True
# 5 False
# dtype: bool
print(s_bool_and.sum())
# 2
Notez que l’utilisation de et ou ou au lieu de & ou | ou l’omission de parenthèses génère une erreur.
Compter par conditions sur les nombres
Vous pouvez spécifier des conditions avec l’opérateur de comparaison <, <=, >, >=, ==, != pour les nombres.
df_num = df[['age', 'point']]
print(df_num)
# age point
# 0 24 64
# 1 42 92
# 2 18 70
# 3 68 70
# 4 24 88
# 5 30 57
print((df_num <= 70).sum())
# age 6
# point 4
# dtype: int64
print(((df['age'] > 20) & (df['age'] < 40)).sum())
# 3
print((df_num % 2 == 1).sum())
# age 0
# point 1
# dtype: int64
Notez que la comparaison de pandas.DataFrame contenant des colonnes de chaîne avec une valeur numérique à l’aide de < ou > génère une erreur. Si vous souhaitez extraire uniquement des colonnes numériques, utilisez select_dtypes().
Compter par conditions sur les chaînes
Pour les chaînes, vous pouvez utiliser ==, ! =, et l’accesseur str de pandas.Series.
- str. contient ()
- str.endswith()
- str.startswith()
- str.match()
Notez que les accesseurs str sont pour pandas.Series et non pour pandas.DataFrame.
df_str = df[['name', 'state']]
print(df_str)
# name state
# 0 Alice NY
# 1 Bob CA
# 2 Charlie CA
# 3 Dave TX
# 4 Ellen CA
# 5 Frank NY
print((df_str == 'NY').sum())
# name 0
# state 2
# dtype: int64
print(df_str['name'].str.endswith('e'))
# 0 True
# 1 False
# 2 True
# 3 True
# 4 False
# 5 False
# Name: name, dtype: bool
print(df_str['name'].str.endswith('e').sum())
# 3
Comptez NaN et nommez NaN
Utilisez les données du Titanic avec la valeur manquante NaN.
df = pd.read_csv('data/src/titanic_train.csv')
print(df.head())
# PassengerId Survived Pclass
# 0 1 0 3
# 1 2 1 1
# 2 3 1 3
# 3 4 1 1
# 4 5 0 3
#
# Name Sex Age SibSp
# 0 Braund, Mr. Owen Harris male 22.0 1
# 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1
# 2 Heikkinen, Miss. Laina female 26.0 0
# 3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1
# 4 Allen, Mr. William Henry male 35.0 0
#
# Parch Ticket Fare Cabin Embarked
# 0 0 A/5 21171 7.2500 NaN S
# 1 0 PC 17599 71.2833 C85 C
# 2 0 STON/O2. 3101282 7.9250 NaN S
# 3 0 113803 53.1000 C123 S
# 4 0 373450 8.0500 NaN S
Consultez les articles suivants pour plus d’informations sur la suppression, le remplacement et la détection de la valeur manquante NaN.
Compter NaN
Utilisez la méthode isnull() pour compter NaN. isnull() détermine si chaque élément est NaN ou non. Pour compter NaN, vous pouvez utiliser sum() comme dans les exemples précédents.
print(df.isnull().head())
# PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket
# 0 False False False False False False False False False
# 1 False False False False False False False False False
# 2 False False False False False False False False False
# 3 False False False False False False False False False
# 4 False False False False False False False False False
#
# Fare Cabin Embarked
# 0 False True False
# 1 False False False
# 2 False True False
# 3 False False False
# 4 False True False
print(df.isnull().sum())
# PassengerId 0
# Survived 0
# Pclass 0
# Name 0
# Sex 0
# Age 177
# SibSp 0
# Parch 0
# Ticket 0
# Fare 0
# Cabin 687
# Embarked 2
# dtype: int64
print(df.isnull().sum(axis=1).head())
# 0 1
# 1 0
# 2 1
# 3 0
# 4 1
# dtype: int64
print(df.isnull().values.sum())
# 866
Nom du compte NaN
Utilisez la méthode count() pour compter les non Nan. Comme sum(), count() compte par colonne par défaut, et par ligne si axis=1.
print(df.count())
# PassengerId 891
# Survived 891
# Pclass 891
# Name 891
# Sex 891
# Age 714
# SibSp 891
# Parch 891
# Ticket 891
# Fare 891
# Cabin 204
# Embarked 889
# dtype: int64
print(df.count(axis=1).head())
# 0 11
# 1 12
# 2 11
# 3 12
# 4 11
# dtype: int64
print(df.count().sum())
# 9826
Vous pouvez également vérifier le nombre de non NaN avec la méthode info().
df.info()
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 891 entries, 0 to 890
# Data columns (total 12 columns):
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 PassengerId 891 non-null int64
# 1 Survived 891 non-null int64
# 2 Pclass 891 non-null int64
# 3 Name 891 non-null object
# 4 Sex 891 non-null object
# 5 Age 714 non-null float64
# 6 SibSp 891 non-null int64
# 7 Parch 891 non-null int64
# 8 Ticket 891 non-null object
# 9 Fare 891 non-null float64
# 10 Cabin 204 non-null object
# 11 Embarked 889 non-null object
# dtypes: float64(2), int64(5), object(5)
# memory usage: 83.7+ KB
