
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:
- Ottieni pandas.DataFrame e pandas.Series di tipo bool
- 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()
- Conteggio per colonna:
- panda.Serie
- panda.DataFrame
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