
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:
- Usa &、|、~ (non e, o, non)
- 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
