
Cet article décrit comment sélectionner des lignes de pandas.DataFrame selon plusieurs conditions.
- Méthode de base pour sélectionner des lignes de pandas.DataFrame
- Sélectionner des lignes avec plusieurs conditions
- La priorité des opérateurs
Deux points à noter sont :
- Utilisez &、|、~ (pas et, ou, pas)
- Placez chaque expression conditionnelle entre parenthèses lors de l’utilisation d’opérateurs de comparaison
Erreur lors de l’utilisation de and, or, not :
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Erreur lorsqu’il n’y a pas de parenthèses :
TypeError: cannot compare a dtyped [object] array with a scalar of type [bool]
Dans l’exemple de code, le fichier CSV suivant est lu et utilisé.
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
L’exemple de code utilise pandas.DataFrame, mais il en va de même pour pandas.Series.
Méthode de base pour sélectionner des lignes de pandas.DataFrame
À l’aide d’une liste, d’un tableau ou de pandas.Series de boolean bool, vous pouvez sélectionner des lignes qui sont 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
Sélectionner des lignes avec plusieurs conditions
Vous pouvez obtenir pandas.Series of bool qui est un ET de deux conditions utilisant &.
Notez que == et ~ sont utilisés ici comme deuxième condition pour des raisons d’explication, mais vous pouvez également utiliser !=.
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
Utilisez ceci pour sélectionner uniquement les lignes True.
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
Utiliser | pour OU.
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
Consultez l’article suivant pour savoir pourquoi vous devez utiliser &, |, ~ au lieu de and, or, not et pourquoi les parenthèses sont nécessaires.
La priorité des opérateurs
L’ordre de priorité des opérateurs en Python est ~ > & > |.
S’il y a trois conditions ou plus, les résultats peuvent varier en fonction de la commande.
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
Il est plus prudent de les mettre entre parenthèses.
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
