0Pricing
Pandas & NumPy Academy · Leçon

Indexation booléenne des DataFrames

Filtrez les lignes en appliquant une condition booléenne à une colonne et en combinant plusieurs conditions avec les opérateurs & et |.

Indexation booléenne des DataFrames est une leçon Pandas & NumPy Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Pandas & NumPy Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Pandas & NumPy Academy comprend 4 leçons au total.

Qu'est-ce que l'indexation booléenne ?

L'indexation booléenne vous permet de filtrer les lignes d'un DataFrame en appliquant une condition qui produit une Series de valeurs True et False. Seules les lignes pour lesquelles la condition vaut True sont renvoyées. Il s'agit de l'une des techniques de sélection les plus utilisées dans Pandas, car elle est à la fois lisible et rapide.

Par exemple, avec un DataFrame de ventes, vous pouvez récupérer instantanément toutes les lignes dont le chiffre d'affaires dépasse 1000 sans écrire de boucle.

import pandas as pd

df = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D'],
    'revenue': [500, 1500, 800, 2000]
})

# Boolean condition produces a Series of True/False
mask = df['revenue'] > 1000
print(mask)
# 0    False
# 1     True
# 2    False
# 3     True

Appliquer le masque booléen

Une fois que vous disposez d'un masque booléen, transmettez-le entre crochets au DataFrame pour sélectionner uniquement les lignes correspondantes. Le résultat est un nouveau DataFrame : l'original n'est jamais modifié. Les index de lignes du DataFrame original sont conservés, ce qui vous permet toujours de savoir d'où provient chaque ligne.

Ce modèle — créer le masque, puis l'appliquer — est la manière standard de filtrer les lignes dans Pandas.

import pandas as pd

df = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D'],
    'revenue': [500, 1500, 800, 2000]
})

mask = df['revenue'] > 1000
filtered = df[mask]
print(filtered)
#   product  revenue
# 1       B     1500
# 3       D     2000

Conditions intégrées sans variable de masque

Vous n'avez pas besoin d'affecter la Series booléenne à une variable. Vous pouvez écrire la condition directement entre les crochets : df[df['col'] > value]. Ce style sur une seule ligne est très courant dans les carnets d'analyse de données, car il garde le code compact et lisible.

Les deux approches — variable de masque et condition intégrée — produisent des résultats identiques. Utilisez une variable lorsque la condition est complexe ou réutilisée, et la condition intégrée pour les filtres simples utilisés une seule fois.

import pandas as pd

df = pd.DataFrame({
    'city': ['NYC', 'LA', 'Chicago', 'Houston'],
    'population': [8_336_817, 3_979_576, 2_693_976, 2_320_268]
})

# Inline boolean filter
large_cities = df[df['population'] > 3_000_000]
print(large_cities)
#   city  population
# 0  NYC   8336817
# 1   LA   3979576

Combiner des conditions avec & (AND)

Pour exiger que les deux conditions soient vraies, combinez-les avec l'opérateur & — et non avec le mot-clé Python and, qui ne fonctionne pas élément par élément sur les tableaux. Chaque condition doit être placée entre parenthèses, car & a une priorité supérieure à celle des opérateurs de comparaison.

Le résultat ne conserve que les lignes pour lesquelles chaque sous-condition s'évalue à True.

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Carol', 'Dave'],
    'age': [25, 35, 28, 45],
    'salary': [50000, 90000, 70000, 120000]
})

# Both conditions must be true
result = df[(df['age'] > 27) & (df['salary'] > 60000)]
print(result)
#     name  age  salary
# 1    Bob   35   90000
# 2  Carol   28   70000

Combiner des conditions avec | (OR)

Utilisez l'opérateur | pour conserver les lignes où au moins une condition est vraie. Comme avec &, chaque sous-condition doit être placée entre parenthèses. L'opérateur | effectue un OU logique élément par élément sur les tableaux booléens.

Il est tout à fait valide de mélanger & et | ; veillez simplement à utiliser les parenthèses correctement pour imposer l'ordre d'évaluation voulu et éviter les erreurs logiques difficiles à détecter.

import pandas as pd

df = pd.DataFrame({
    'product': ['Laptop', 'Mouse', 'Monitor', 'Keyboard'],
    'price': [1200, 25, 300, 80],
    'category': ['Electronics', 'Accessories', 'Electronics', 'Accessories']
})

# Rows where price > 200 OR category is Accessories
result = df[(df['price'] > 200) | (df['category'] == 'Accessories')]
print(result)
#     product  price     category
# 0    Laptop   1200  Electronics
# 1     Mouse     25  Accessories
# 2   Monitor    300  Electronics
# 3  Keyboard     80  Accessories

Nier une condition avec ~

L'opérateur tilde ~ inverse une Series booléenne : il transforme True en False, et inversement. Utilisez ~ pour exprimer une logique « NOT » : conservez les lignes qui ne correspondent pas à une condition. Cette méthode est plus claire que la construction manuelle de la condition opposée.

Par exemple, df[~df['status'].isin(['cancelled', 'refunded'])] conserve toutes les lignes sauf celles correspondant à ces deux statuts.

import pandas as pd

df = pd.DataFrame({
    'order_id': [1, 2, 3, 4],
    'status': ['shipped', 'cancelled', 'delivered', 'refunded']
})

# Keep only rows that are NOT cancelled
active = df[~(df['status'] == 'cancelled')]
print(active)
#    order_id     status
# 0         1    shipped
# 2         3  delivered
# 3         4   refunded

Filtrer sur des valeurs textuelles

L'indexation booléenne fonctionne tout aussi bien sur les colonnes textuelles. Vous pouvez filtrer une correspondance exacte avec ==, ou utiliser des méthodes .str comme .str.startswith(), .str.contains() ou .str.upper() dans la condition pour effectuer un filtrage textuel flexible.

Par défaut, les comparaisons de chaînes dans Pandas tiennent compte de la casse : 'NYC' et 'nyc' sont donc considérées comme des valeurs différentes. Normalisez d'abord la casse si nécessaire.

import pandas as pd

df = pd.DataFrame({
    'country': ['USA', 'Germany', 'UK', 'USA', 'France'],
    'sales': [400, 200, 150, 600, 300]
})

# Filter rows where country equals USA
us_sales = df[df['country'] == 'USA']
print(us_sales)
#   country  sales
# 0     USA    400
# 3     USA    600

# Filter rows where country starts with 'G'
g_countries = df[df['country'].str.startswith('G')]
print(g_countries)
#    country  sales
# 1  Germany    200

Filtrer sur plusieurs colonnes

Les analyses complexes nécessitent souvent des conditions portant sur plusieurs colonnes, combinées avec & et |. Pour rendre le code lisible, décomposez les conditions très longues en Series booléennes nommées ; chacune agit comme un sous-filtre nommé que vous combinez à la fin.

Cette approche clarifie votre intention : chaque ligne se lit comme une phrase décrivant une partie de la logique du filtre.

import pandas as pd

df = pd.DataFrame({
    'region': ['North', 'South', 'North', 'East'],
    'year': [2022, 2023, 2023, 2022],
    'profit': [5000, -200, 8000, 3000]
})

is_north = df['region'] == 'North'
is_2023 = df['year'] == 2023
is_profitable = df['profit'] > 0

result = df[is_north & is_2023 & is_profitable]
print(result)
#   region  year  profit
# 2  North  2023    8000

Utiliser np.where pour créer des colonnes conditionnelles

L'indexation booléenne filtre les lignes, mais vous pouvez parfois vouloir ajouter une nouvelle colonne selon une condition plutôt que supprimer des lignes. np.where(condition, value_if_true, value_if_false) est l'équivalent vectorisé d'une structure if/else appliquée élément par élément à une colonne ; cette approche est bien plus rapide que l'utilisation de apply avec une lambda.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'score': [45, 72, 88, 61, 95]
})

# Create a new column based on a condition
df['grade'] = np.where(df['score'] >= 70, 'Pass', 'Fail')
print(df)
#    score grade
# 0     45  Fail
# 1     72  Pass
# 2     88  Pass
# 3     61  Fail
# 4     95  Pass

Affecter des valeurs à un sous-ensemble filtré

Vous pouvez mettre à jour directement les valeurs des lignes filtrées avec .loc[mask, column]. C'est la manière sûre de définir des valeurs dans un sous-ensemble ; l'indexation chaînée, comme df[mask]['col'] = value, peut déclencher un SettingWithCopyWarning, car elle agit sur une copie.

Privilégiez toujours df.loc[mask, 'col'] = value lorsque vous souhaitez modifier directement le DataFrame original.

import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C', 'D'],
    'stock': [0, 5, 0, 12]
})

# Mark out-of-stock items
df.loc[df['stock'] == 0, 'status'] = 'Out of Stock'
df.loc[df['stock'] > 0, 'status'] = 'Available'
print(df)
#   item  stock        status
# 0    A      0  Out of Stock
# 1    B      5     Available
# 2    C      0  Out of Stock
# 3    D     12     Available

Compter et additionner le masque

Comme les valeurs booléennes sont en interne 1 (True) et 0 (False), vous pouvez appeler .sum() sur un masque pour compter les lignes correspondantes, ou .mean() pour obtenir la proportion de lignes correspondantes. Ces comptages rapides vous aident à vérifier la logique de votre filtre avant de l'appliquer pour sélectionner des lignes.

import pandas as pd

df = pd.DataFrame({'value': [10, 55, 30, 80, 20, 70]})

mask = df['value'] > 40
print('Count of rows > 40:', mask.sum())      # 3
print('Fraction > 40:', mask.mean().round(2)) # 0.5

# Now apply
print(df[mask])
#    value
# 1     55
# 3     80
# 5     70

Vérification rapide

Vérifiez votre compréhension de l'indexation booléenne sur les DataFrames.

Récapitulatif de la leçon

Dans cette leçon, vous avez appris que : les masques booléens filtrent les lignes en appliquant une condition à une colonne, les opérateurs & et | combinent plusieurs conditions (et non les opérateurs Python and/or), et ~ inverse un masque booléen pour appliquer une logique NOT. Utilisez df.loc[mask, col] = value pour affecter des valeurs en toute sécurité aux lignes filtrées. Ensuite, nous découvrirons la méthode query(), qui permet d'écrire des filtres sous forme de chaînes lisibles.

Questions Fréquemment Posées

La leçon « Indexation booléenne des DataFrames » est-elle gratuite ?

Oui — le texte complet de « Indexation booléenne des DataFrames » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Pandas & NumPy Academy, passe à CoddyKit PRO. Le cours Pandas & NumPy Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Indexation booléenne des DataFrames » ?

Filtrez les lignes en appliquant une condition booléenne à une colonne et en combinant plusieurs conditions avec les opérateurs & et |. Tu pratiques Pandas & NumPy Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Pandas & NumPy Academy ?

Aucune expérience préalable n'est requise. Pandas & NumPy Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « Indexation booléenne des DataFrames » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Pandas & NumPy Academy ?

Oui. Chaque leçon Pandas & NumPy Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Indexation booléenne des DataFrames
  2. La méthode query()
  3. Filtres isin() et between()
  4. Sélectionner des colonnes par motif
← Retour à Pandas & NumPy Academy