Skip to content

pandas : Compter les éléments de DataFrame/Series correspondant à des conditions

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 :

  1. Obtenez pandas.DataFrame et pandas.Series de type booléen
  2. 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()
    • pandas.Série

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