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 TrueAppliquer 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 2000Conditions 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 3979576Combiner 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 70000Combiner 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 AccessoriesNier 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 refundedFiltrer 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 200Filtrer 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 8000Utiliser 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 PassAffecter 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 AvailableCompter 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 70Vé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
- Indexation booléenne des DataFrames
- La méthode query()
- Filtres isin() et between()
- Sélectionner des colonnes par motif