Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 43

Filtering and Sorting DataFrames

Recommended resources

Bonjour ! Dans notre dernière leçon, vous avez appris à sélectionner des données dans un DataFrame en utilisant leur position (.iloc) et leur étiquette (.loc). Ces outils sont essentiels pour naviguer dans vos données. Aujourd'hui, nous allons aller plus loin en apprenant à sélectionner des données non pas par leur emplacement, mais par leur valeur.

L'objectif de cette leçon est de vous apprendre à filtrer un DataFrame en fonction de conditions spécifiques (par exemple, "toutes les voitures avec une consommation supérieure à une certaine valeur") et à trier les résultats pour mieux les analyser. Ces deux compétences, le filtrage et le tri, constituent le cœur de l'exploration de données et sont des opérations que vous utiliserez constamment dans vos projets de machine learning.

1. Filtrer les données avec des conditions booléennes

Dans la leçon précédente, nous nous sommes arrêtés sur une question : comment sélectionner "tous les étudiants qui ont eu plus de 15 en Maths" ? La réponse réside dans le filtrage booléen.

L'idée est simple :

  1. Vous écrivez une condition qui s'applique à une colonne du DataFrame. Par exemple, df['Maths'] > 15.
  2. Pandas évalue cette condition pour chaque ligne et retourne une Series contenant des valeurs True (si la condition est remplie) ou False (sinon). On appelle cela un masque booléen.
  3. Vous utilisez ce masque pour indexer le DataFrame, ce qui ne conservera que les lignes où la valeur est True.

Reprenons notre DataFrame df_notes de la leçon précédente :

import pandas as pd

data = {'Maths': [15, 12, 18, 9],
        'Physique': [13, 16, 17, 11],
        'Chimie': [11, 14, 15, 12]}
index_labels = ['Ahmed', 'Fatima', 'Youssef', 'Aisha']
df_notes = pd.DataFrame(data, index=index_labels)

Pour sélectionner les étudiants avec une note en Maths supérieure à 14, nous faisons :




# 1. Créer le masque booléen
masque = df_notes['Maths'] > 14
print(masque)

Résultat :

Ahmed       True
Fatima     False
Youssef     True
Aisha      False
Name: Maths, dtype: bool

Maintenant, appliquons ce masque à notre DataFrame :




# 2. Appliquer le masque pour filtrer
etudiants_filtres = df_notes[masque]
print(etudiants_filtres)

Résultat :

         Maths  Physique  Chimie
Ahmed       15        13      11
Youssef     18        17      15

On peut bien sûr combiner ces deux étapes en une seule ligne, ce qui est la pratique courante :

print(df_notes[df_notes['Maths'] > 14])

La vidéo suivante, de la chaîne "Alex The Analyst", montre de manière très claire comment appliquer ces filtres simples et d'autres plus complexes.

Filtering Columns and Rows in Pandas | Python Pandas Tutorials

Cette vidéo est une excellente introduction pratique au filtrage. L'instructeur est très direct et les exemples sont faciles à suivre.

Regardez ces trois passages pour maîtriser les techniques de base : Filtrage avec des opérateurs de comparaison : Observez comment il utilise < et <= pour filtrer des données numériques dans cette section. Filtrage avec .isin() : Apprenez à filtrer des lignes dont la valeur d'une colonne appartient à une liste prédéfinie ici. C'est l'équivalent de la clause IN en SQL. Filtrage avec .str.contains() : Découvrez comment filtrer des données textuelles en cherchant une sous-chaîne dans cette partie, ce qui est très utile pour les données non structurées.

Combinaison de plusieurs conditions

La véritable puissance du filtrage se révèle lorsque vous combinez plusieurs conditions. Pour cela, on utilise les opérateurs & (ET logique) et | (OU logique).

Attention : En raison des règles de précédence des opérateurs en Python, chaque condition doit être entourée de parenthèses.

Par exemple, pour trouver les étudiants qui ont plus de 15 en Maths ET plus de 16 en Physique :

df_notes[(df_notes['Maths'] > 15) & (df_notes['Physique'] > 16)]

Résultat :

         Maths  Physique  Chimie
Youssef     18        17      15

Pour trouver les étudiants qui ont moins de 10 en Maths OU plus de 15 en Physique :

df_notes[(df_notes['Maths'] < 10) | (df_notes['Physique'] > 15)]

Résultat :

        Maths  Physique  Chimie
Fatima     12        16      14
Youssef    18        17      15
Aisha       9        11      12

L'image ci-dessous illustre parfaitement un filtrage avec plusieurs conditions &.

Cet exemple montre comment filtrer un DataFrame pour ne garder que les lignes qui satisfont simultanément quatre conditions distinctes : le nom contient 'a', l'année est supérieure à 1980, le genre est 'Female', et le nombre est supérieur à 1500.

2. Trier un DataFrame

Après avoir filtré les données qui nous intéressent, l'étape suivante consiste souvent à les trier pour identifier les extrêmes (les plus grandes ou les plus petites valeurs) ou simplement pour organiser l'affichage. La méthode principale pour cela est .sort_values().

Un exemple simple de tri : le DataFrame est trié en fonction des valeurs de la colonne 'Age', de la plus petite à la plus grande.

Trier par une seule colonne

Pour trier un DataFrame, vous devez spécifier la colonne qui servira de clé de tri avec le paramètre by. Par défaut, le tri est ascendant (du plus petit au plus grand).




# Trier les notes par ordre croissant de la note de Physique
df_notes.sort_values(by='Physique')

Résultat :

         Maths  Physique  Chimie
Aisha        9        11      12
Ahmed       15        13      11
Fatima      12        16      14
Youssef     18        17      15

Pour un tri descendant (du plus grand au plus petit), il suffit d'ajouter ascending=False.




# Trier les notes par ordre décroissant de la note de Physique
df_notes.sort_values(by='Physique', ascending=False)

Résultat :

         Maths  Physique  Chimie
Youssef     18        17      15
Fatima      12        16      14
Ahmed       15        13      11
Aisha        9        11      12

Trier par plusieurs colonnes

Il est souvent utile de trier selon plusieurs critères. Par exemple, trier par note de Physique, et en cas d'égalité, trier par note de Maths. Pour cela, on passe une liste de noms de colonnes au paramètre by. L'ordre dans la liste définit la priorité du tri.




# Créons un nouveau DataFrame avec des égalités pour l'exemple
data2 = {'Matiere': ['Physique', 'Maths', 'Physique'],
         'Note': [15, 18, 15],
         'Coefficient': [3, 5, 4]}
df_examens = pd.DataFrame(data2)




# Trier d'abord par 'Note' (descendant), puis par 'Coefficient' (ascendant)
df_examens.sort_values(by=['Note', 'Coefficient'], ascending=[False, True])

Ici, nous passons une liste au paramètre ascending : False s'applique à 'Note' et True s'applique à 'Coefficient'.

Résultat :

    Matiere  Note  Coefficient
1     Maths    18            5
0  Physique    15            3  # Note 15, Coeff 3
2  Physique    15            4  # Note 15, Coeff 4

Remarquez que pour la Note de 15, les lignes ont été ensuite triées par Coefficient croissant.

La section sur le tri dans la vidéo d'Alex The Analyst démontre ces concepts de manière très visuelle.

Filtering Columns and Rows in Pandas | Python Pandas Tutorials

Cette partie de la vidéo est un excellent complément visuel à la lecture.

Regardez attentivement la section sur le tri. L'instructeur montre comment : Trier par une seule colonne (.sort_values(by='column')). Changer l'ordre avec ascending=False. Trier par plusieurs colonnes en passant une liste. Spécifier des ordres de tri différents pour chaque colonne.

Pour une analyse plus approfondie et des exemples supplémentaires, l'article de Real Python est une référence de premier ordre.

pandas Sort: Your Guide to Sorting Data in Python

Cet article couvre en détail toutes les facettes de la fonction .sort_values(). Il vous servira de référence solide.

Concentrez-vous sur deux sections principales : "Sorting Your DataFrame on a Single Column" : Cette partie revient sur le tri simple et le tri descendant. "Sorting Your DataFrame on Multiple Columns" : Lisez attentivement cette section qui explique comment trier par plusieurs colonnes et, surtout, comment appliquer des ordres de tri différents à chaque colonne, ce qui est une technique très puissante.

Note importante : Par défaut, les méthodes comme .sort_values() retournent une nouvelle copie du DataFrame trié, sans modifier l'original. C'est une bonne pratique car elle préserve vos données initiales. Si vous voulez modifier le DataFrame original "sur place", vous pouvez ajouter le paramètre inplace=True, mais utilisez-le avec prudence, surtout en tant que débutant.


Exercice pratique

Mettons en pratique ces deux compétences. Imaginez que vous analysez les données de performance de plusieurs voitures.

import pandas as pd




# Création du DataFrame de voitures
data_voitures = {
    'Marque': ['Toyota', 'Honda', 'Ford', 'Toyota', 'Ford', 'Honda'],
    'Modele': ['Camry', 'Civic', 'Mustang', 'Corolla', 'Fiesta', 'Accord'],
    'Annee': [2020, 2021, 2022, 2021, 2020, 2022],
    'Consommation': [7.8, 6.5, 12.5, 6.8, 5.5, 7.2], # en L/100km
    'Puissance': [203, 158, 450, 139, 95, 192] # en ch
}
df_voitures = pd.DataFrame(data_voitures)

Vos tâches :

  1. Filtrez le DataFrame pour n'afficher que les voitures fabriquées après 2020.
  2. Filtrez pour trouver les voitures Ford avec une puissance supérieure à 100 ch.
  3. Triez l'ensemble du DataFrame par consommation, de la plus basse à la plus élevée.
  4. Filtrez les voitures avec une consommation inférieure à 8 L/100km, puis triez le résultat par puissance, de la plus élevée à la plus basse.

Solutions




# 1. Voitures fabriquées après 2020
print("1. Voitures après 2020:")
print(df_voitures[df_voitures['Annee'] > 2020])
print("\n" + "="*40 + "\n")




# 2. Voitures Ford puissantes
condition_marque = df_voitures['Marque'] == 'Ford'
condition_puissance = df_voitures['Puissance'] > 100
print("2. Ford de plus de 100 ch:")
print(df_voitures[condition_marque & condition_puissance])
print("\n" + "="*40 + "\n")




# 3. Trier par consommation
print("3. Tri par consommation (ascendant):")
print(df_voitures.sort_values(by='Consommation'))
print("\n" + "="*40 + "\n")




# 4. Filtrer puis trier
print("4. Voitures sobres triées par puissance (descendant):")
voitures_sobres = df_voitures[df_voitures['Consommation'] < 8.0]
print(voitures_sobres.sort_values(by='Puissance', ascending=False))

Résultat attendu :

1. Voitures après 2020:
  Marque   Modele  Annee  Consommation  Puissance
1  Honda    Civic   2021           6.5        158
2   Ford  Mustang   2022          12.5        450
3 Toyota  Corolla   2021           6.8        139
5  Honda   Accord   2022           7.2        192

========================================

2. Ford de plus de 100 ch:
  Marque   Modele  Annee  Consommation  Puissance
2   Ford  Mustang   2022          12.5        450

========================================

3. Tri par consommation (ascendant):
  Marque   Modele  Annee  Consommation  Puissance
4   Ford   Fiesta   2020           5.5         95
1  Honda    Civic   2021           6.5        158
3 Toyota  Corolla   2021           6.8        139
5  Honda   Accord   2022           7.2        192
0 Toyota    Camry   2020           7.8        203
2   Ford  Mustang   2022          12.5        450

========================================

4. Voitures sobres triées par puissance (descendant):
  Marque   Modele  Annee  Consommation  Puissance
0 Toyota    Camry   2020           7.8        203
5  Honda   Accord   2022           7.2        192
1  Honda    Civic   2021           6.5        158
3 Toyota  Corolla   2021           6.8        139
4   Ford   Fiesta   2020           5.5         95

Conclusion

Félicitations ! Vous maîtrisez maintenant deux des opérations les plus fondamentales de Pandas. Savoir filtrer et trier efficacement vos données est la première étape de toute analyse sérieuse.

Les points clés à retenir :

  • Le filtrage booléen (df[condition]) permet de sélectionner des lignes en fonction de leurs valeurs.
  • Combinez les conditions avec & (ET) et | (OU), en n'oubliant pas les parenthèses autour de chaque condition.
  • Utilisez .sort_values() pour trier les données, en spécifiant la ou les colonnes avec by et l'ordre avec ascending.

En explorant et en nettoyant des jeux de données réels, vous rencontrerez inévitablement des valeurs manquantes (NaN). Comment les détecter ? Faut-il les supprimer ou les remplacer ? C'est une étape cruciale du prétraitement des données, et ce sera précisément le sujet de notre prochaine leçon.