Skip to content

pandas: Selezionare righe con condizioni multiple

Python

Questo articolo descrive come selezionare righe di panda.DataFrame in base a più condizioni.

  • Metodo di base per la selezione di righe di pandas.DataFrame
  • Seleziona le righe con più condizioni
  • La precedenza dell’operatore

Due punti da notare sono:

  1. Usa &、|、~ (non e, o, non)
  2. Racchiudere ogni espressione condizionale tra parentesi quando si utilizza gli operatori di confronto

Errore durante l’utilizzo e, oppure no:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Errore senza parentesi:

TypeError: cannot compare a dtyped [object] array with a scalar of type [bool]

Nel codice di esempio viene letto e utilizzato il seguente file CSV.

import pandas as pd

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

Il codice di esempio utilizza pandas.DataFrame, ma lo stesso vale per pandas.Series.

Metodo di base per la selezione di righe di pandas.DataFrame

Selezionando un elenco, una matrice o pandas.Series di boolean boole, è possibile selezionare le righe che sono True.

mask = [True, False, True, False, True, False]
df_mask = df[mask]
print(df_mask)
#       name  age state  point
# 0    Alice   24    NY     64
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88

Seleziona le righe con più condizioni

Puoi ottenere pandas.Series di bool che è un AND di due condizioni usando &.

Nota che == e ~ sono usati qui come seconda condizione per motivi di spiegazione, ma puoi usare anche !=.

print(df['age'] < 35)
# 0     True
# 1    False
# 2     True
# 3    False
# 4     True
# 5     True
# Name: age, dtype: bool

print(~(df['state'] == 'NY'))
# 0    False
# 1     True
# 2     True
# 3     True
# 4     True
# 5    False
# Name: state, dtype: bool

print((df['age'] < 35) & ~(df['state'] == 'NY'))
# 0    False
# 1    False
# 2     True
# 3    False
# 4     True
# 5    False
# dtype: bool

Usalo per selezionare solo le righe vere.

df_and = df[(df['age'] < 35) & ~(df['state'] == 'NY')]
print(df_and)
#       name  age state  point
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88

Usa | per OR.

print((df['age'] < 20) | (df['point'] > 90))
# 0    False
# 1     True
# 2     True
# 3    False
# 4    False
# 5    False
# dtype: bool

df_or = df[(df['age'] < 20) | (df['point'] > 90)]
print(df_or)
#       name  age state  point
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70

Vedere il seguente articolo per sapere perché è necessario utilizzare &, |, ~ invece di e, o, non e perché sono necessarie le parentesi.

La precedenza dell’operatore

L’ordine di precedenza degli operatori in Python è ~ > & > |.

Se sono presenti tre o più condizioni, i risultati possono variare a seconda dell’ordine.

df_multi_1 = df[(df['age'] < 35) | ~(df['state'] == 'NY') & (df['point'] < 75)]
print(df_multi_1)
#       name  age state  point
# 0    Alice   24    NY     64
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

df_multi_2 = df[(df['age'] < 35) & (df['point'] < 75) | ~(df['state'] == 'NY')]
print(df_multi_2)
#       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

È più sicuro racchiuderli tra parentesi.

df_multi_3 = df[((df['age'] < 35) | ~(df['state'] == 'NY')) & (df['point'] < 75)]
print(df_multi_3)
#       name  age state  point
# 0    Alice   24    NY     64
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 5    Frank   30    NY     57