logo oujood
🔍

Filtrer par conditions dans Pandas

Le filtrage conditionnel est l'opération que vous ferez le plus souvent sur un DataFrame. Pandas propose plusieurs syntaxes selon la complexité des conditions : un opérateur simple, plusieurs conditions combinées, ou une liste de valeurs à exclure ou inclure.

OUJOOD.COM

Filtrer avec une condition simple

La syntaxe de base : vous écrivez une condition entre crochets. Pandas l'évalue ligne par ligne et ne retourne que les lignes où elle est vraie. Le résultat est toujours un DataFrame.

  📋 Copier le code

import pandas as pd

data = {
    "nom":        ["Alice", "Bob", "Clara", "David", "Eva"],
    "âge":        [28, 34, 22, 45, 31],
    "département":["RH", "Tech", "Tech", "Finance", "RH"],
    "salaire":    [2800, 3500, 2200, 4100, 2950]
}
df = pd.DataFrame(data)

# Lignes où l'âge est supérieur à 30
print(df[df["âge"] > 30])

# Lignes où le département est exactement "Tech"
print(df[df["département"] == "Tech"])

# Lignes où le salaire est inférieur ou égal à 3000
print(df[df["salaire"] <= 3000])

df[df["âge"] > 30] produit d'abord un masque booléen — une Series de True/False pour chaque ligne — puis le passe au DataFrame qui ne retient que les lignes True. Vous pouvez stocker ce masque dans une variable et le réutiliser : masque = df["âge"] > 30, puis df[masque].

Combiner plusieurs conditions

Pour combiner des conditions, Pandas utilise & (ET), | (OU) et ~ (NON). Chaque condition doit être entre parenthèses — sans ça, Python évalue dans le mauvais ordre et lève une erreur.

  📋 Copier le code

import pandas as pd

data = {
    "nom":         ["Alice", "Bob", "Clara", "David", "Eva"],
    "âge":         [28, 34, 22, 45, 31],
    "département": ["RH", "Tech", "Tech", "Finance", "RH"],
    "salaire":     [2800, 3500, 2200, 4100, 2950]
}
df = pd.DataFrame(data)

# ET : département Tech ET salaire > 3000
print(df[(df["département"] == "Tech") & (df["salaire"] > 3000)])

# OU : âge < 25 OU salaire > 4000
print(df[(df["âge"] < 25) | (df["salaire"] > 4000)])

# NON : tout sauf les RH
print(df[~(df["département"] == "RH")])

N'utilisez jamais and, or et not à la place de &, | et ~. Ces mots-clés Python ne fonctionnent pas sur des Series et lèvent une ValueError. Le & et le | sont les opérateurs bit à bit qui, appliqués à des Series booléennes, font exactement ce qu'on attend.

Filtrer avec isin() et between()

Quand vous devez filtrer sur une liste de valeurs précises, isin() est plus lisible qu'une longue chaîne de conditions OR. between() teste si une valeur est dans un intervalle fermé.

  📋 Copier le code

import pandas as pd

data = {
    "nom":         ["Alice", "Bob", "Clara", "David", "Eva"],
    "âge":         [28, 34, 22, 45, 31],
    "département": ["RH", "Tech", "Tech", "Finance", "RH"],
    "salaire":     [2800, 3500, 2200, 4100, 2950]
}
df = pd.DataFrame(data)

# isin() : lignes dont le département est RH ou Finance
print(df[df["département"].isin(["RH", "Finance"])])

# ~isin() : tout sauf ces départements
print(df[~df["département"].isin(["RH", "Finance"])])

# between() : âge entre 25 et 35 inclus
print(df[df["âge"].between(25, 35)])

between(25, 35) est équivalent à (df["âge"] >= 25) & (df["âge"] <= 35) mais beaucoup plus compact. Les deux bornes sont incluses par défaut. Combiner ~ avec isin() est le moyen le plus propre d'exclure une liste de valeurs.

Filtrer avec query()

query() accepte une condition écrite comme une chaîne de caractères. La syntaxe est proche du SQL et souvent plus lisible pour les conditions complexes — pas besoin de répéter df ni d'enchaîner des crochets.

  📋 Copier le code

import pandas as pd

data = {
    "nom":         ["Alice", "Bob", "Clara", "David", "Eva"],
    "âge":         [28, 34, 22, 45, 31],
    "département": ["RH", "Tech", "Tech", "Finance", "RH"],
    "salaire":     [2800, 3500, 2200, 4100, 2950]
}
df = pd.DataFrame(data)

# Condition simple avec query()
print(df.query("âge > 30"))

# Conditions combinées
print(df.query("département == 'Tech' and salaire > 3000"))

# Utiliser une variable Python dans la condition avec @
seuil = 3000
print(df.query("salaire > @seuil"))

Pour injecter une variable Python dans une chaîne query(), préfixez-la avec @. Sans ça, Pandas cherche une colonne portant ce nom et lève une erreur. query() est particulièrement utile pour les conditions longues ou dans un pipeline de traitement où la lisibilité compte.

Par carabde | Mis à jour le 26 avril 2026