Skip to content

pandas: Contare gli elementi di DataFrame/Series che corrispondono alle condizioni

Python

Questo articolo descrive come contare gli elementi che soddisfano determinate condizioni in pandas.DataFrame e pandas.Series.

  • Come contare gli elementi che soddisfano la condizione
  • E, O, NON per più condizioni
  • Conta in base alle condizioni sui numeri
  • Conta per condizioni sulle stringhe
  • Conte NaN e non NaN

Vedere l’articolo seguente su come estrarre le righe che soddisfano le condizioni.

Usa il seguente file CSV come esempio.

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

Come contare gli elementi che soddisfano la condizione

La procedura per contare gli elementi che soddisfano determinate condizioni è la seguente:

  1. Ottieni pandas.DataFrame e pandas.Series di tipo bool
  2. Conta True con il metodo sum()
    • panda.DataFrame
      • Conteggio per colonna:sum()
      • Conteggio per riga:sum(axis=1)
      • Conta il totale:sum().sum() or values.sum()
    • panda.Serie

panda.DataFrame

Applicando l’operatore di confronto a pandas.DataFrame e pandas.Series, ogni elemento viene confrontato e vengono restituiti pandas.DataFrame e pandas.Series di tipo bool (True, False) della stessa dimensione.

Le parentesi () sul lato destro possono essere omesse.

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

Poiché True è considerato 1 e False è considerato 0 in Python, puoi ottenere il numero di elementi che soddisfano la condizione con il sum metodo().

Per impostazione predefinita, conta per colonna e, con asse=1, conta per riga.

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() di pandas.DataFrame fornisce pandas.Series. Puoi ottenere il numero totale chiamando sum() di pandas.Series.

print(df_bool.sum().sum())
# 3

Puoi ottenere pandas.DataFrame nell’array NumPy numpy.ndarray con l’attributo values.

Il metodo sum() di numpy.ndarray calcola il numero totale per calcolo predefinito. Pertanto, puoi ottenere il numero totale di elementi che soddisfano la condizione chiamando sum() dall’attributo 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

Puoi scrivere come segue:

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

panda.Serie

Usa i seguenti pandas.Series.

s = df['age']
print(s)
# 0    24
# 1    42
# 2    18
# 3    68
# 4    24
# 5    30
# Name: age, dtype: int64

La procedura è la stessa di pandas.DataFrame. La serie è un dato unidimensionale, quindi il metodo sum() restituisce il numero totale.

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

Se vuoi contare gli elementi che soddisfano la condizione per qualsiasi riga o colonna, puoi fare lo stesso specificando la riga o la colonna con [], loc[] o iloc[].

E, O, NON per più condizioni

Per combinare più condizioni, racchiudere ciascuna espressione condizionale tra parentesi () e utilizzare i seguenti operatori.

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

Si noti che utilizzando eoo invece di & o | o l’omissione delle parentesi generi un errore.

Conta in base alle condizioni sui numeri

È possibile specificare le condizioni con l’operatore di confronto <, <=, >, >=, ==, != per i numeri.

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

Si noti che il confronto di pandas.DataFrame contenente colonne stringa con un valore numerico utilizzando < o > generi un errore. Se vuoi estrarre solo colonne numeriche, usa select_dtypes().

Conta per condizioni sulle stringhe

Per le stringhe, puoi usare ==, ! = e l’accessor str di pandas.Series.

  • str.contains()
  • str.endswith()
  • str.inizia con()
  • str.match()

Si noti che le funzioni di accesso str sono per pandas.Series e non per 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

Conte NaN e non NaN

Usa i dati Titanic con il valore mancante 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  

Per informazioni sulla rimozione, la sostituzione e il rilevamento del valore mancante NaN, vedere gli articoli seguenti.

Conte Na N

Usa il metodo isnull() per contare NaN. isnull() determina se ogni elemento è NaN o meno. Per contare NaN, puoi usare sum() come negli esempi precedenti.

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

Conte non NaN

Usa il metodo count() per contare non Nan. Come sum(), count() conta per colonna per la configurazione predefinita e per riga se asse=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

Puoi anche controllare il numero di non NaN con il metodo 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