Skip to content

pandas : Sélectionner des lignes avec plusieurs conditions

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 :

  1. Utilisez &、|、~ (pas et, ou, pas)
  2. 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