Prépa Python

Avancé — chapitre 39 sur 54

Extraction et traitement de volumes de données

Filtrer, transformer, agréger, grouper — les 4 opérations de base

65 minAbonnés

Beaucoup de programmes passent leur temps à manipuler des collections de données : notes d'élèves, transactions, capteurs, articles... Ce chapitre rassemble les 4 opérations de base qu'on applique à des volumes de données, et montre comment les combiner pour produire des résultats utiles.

Les 4 opérations de base

Opération Rôle Résultat
Filtrer Garder un sous-ensemble selon un critère Nouvelle collection (éventuellement plus petite)
Transformer Appliquer une fonction à chaque élément Nouvelle collection (même taille)
Agréger Combiner tous les éléments en une valeur unique Une valeur (somme, moyenne, max...)
Grouper Répartir les éléments par catégorie Dictionnaire par catégorie

Vous verrez ces 4 opérations partout : Excel (filtres, formules, pivot), SQL (WHERE, SELECT, SUM, GROUP BY), Pandas... et bien sûr en Python.

Pour toutes les démos, on utilisera le même jeu de données :

python
etudiants = [
    {"nom": "Alice",   "classe": "A", "note": 14, "age": 20},
    {"nom": "Bob",     "classe": "B", "note":  8, "age": 22},
    {"nom": "Charlie", "classe": "A", "note": 17, "age": 19},
    {"nom": "Diana",   "classe": "B", "note":  9, "age": 21},
    {"nom": "Eve",     "classe": "A", "note": 15, "age": 20},
    {"nom": "Frank",   "classe": "B", "note": 11, "age": 23},
    {"nom": "Grace",   "classe": "A", "note": 18, "age": 19},
]

Filtrer une collection

Filtrer = conserver uniquement les éléments qui vérifient une condition.

Avec une boucle explicite

python
etudiants = [
    {"nom": "Alice",   "classe": "A", "note": 14, "age": 20},
    {"nom": "Bob",     "classe": "B", "note":  8, "age": 22},
    {"nom": "Charlie", "classe": "A", "note": 17, "age": 19},
    {"nom": "Diana",   "classe": "B", "note":  9, "age": 21},
    {"nom": "Eve",     "classe": "A", "note": 15, "age": 20},
    {"nom": "Frank",   "classe": "B", "note": 11, "age": 23},
    {"nom": "Grace",   "classe": "A", "note": 18, "age": 19},
]

# Filtrer : les étudiants ayant 10 ou plus
admis = []
for e in etudiants:
    if e["note"] >= 10:
        admis.append(e)

print(f"{len(admis)} étudiants admis")
for e in admis:
    print(f"  {e['nom']} : {e['note']}")

Avec une compréhension de liste

La même chose en une ligne avec une compréhension de liste (chapitre 1 de cette partie) :

python
etudiants = [
    {"nom": "Alice",   "classe": "A", "note": 14, "age": 20},
    {"nom": "Bob",     "classe": "B", "note":  8, "age": 22},
    {"nom": "Charlie", "classe": "A", "note": 17, "age": 19},
    {"nom": "Diana",   "classe": "B", "note":  9, "age": 21},
    {"nom": "Eve",     "classe": "A", "note": 15, "age": 20},
    {"nom": "Frank",   "classe": "B", "note": 11, "age": 23},
    {"nom": "Grace",   "classe": "A", "note": 18, "age": 19},
]

admis = [e for e in etudiants if e["note"] >= 10]
print(f"{len(admis)} étudiants admis")

C'est plus court, plus lisible, et plus rapide : c'est la forme à privilégier dès que le filtre tient en une condition.

Filtrage avec la fonction filter()

Python propose aussi la fonction native filter(). Moins utilisée aujourd'hui au profit des compréhensions, mais à reconnaître pour le TOSA.

python
etudiants = [
    {"nom": "Alice", "note": 14},
    {"nom": "Bob",   "note": 8},
    {"nom": "Eve",   "note": 15},
]

admis = list(filter(lambda e: e["note"] >= 10, etudiants))
print(admis)

filter(fonction, iterable) renvoie un itérateur — d'où le list(...) pour voir le résultat.

Transformer une collection

Transformer = appliquer une fonction à chaque élément pour produire une nouvelle collection.

Avec une boucle

python
notes = [12, 15, 9, 17, 11]

# Convertir en note sur 100
notes_100 = []
for n in notes:
    notes_100.append(n * 5)

print(notes_100)

Avec une compréhension

python
notes = [12, 15, 9, 17, 11]

notes_100 = [n * 5 for n in notes]
print(notes_100)

Extraire un champ d'une liste de dicts (cas très fréquent)

python
etudiants = [
    {"nom": "Alice", "note": 14},
    {"nom": "Bob",   "note": 8},
    {"nom": "Eve",   "note": 15},
]

# Ne garder que les noms
noms = [e["nom"] for e in etudiants]
print(noms)

# Ne garder que les notes
notes = [e["note"] for e in etudiants]
print(notes)

Avec la fonction map()

Comme pour filter(), Python propose map(fonction, iterable). Moins utilisée aujourd'hui.

python
notes = [12, 15, 9, 17]

notes_100 = list(map(lambda n: n * 5, notes))
print(notes_100)

Suite réservée aux abonnés

Débloquez l'intégralité du parcours

Les 54 chapitres, les exercices corrigés automatiquement, les examens blancs et le suivi de votre progression.

Voir les offresChapitres en accès libre

Déjà un accès ? Connectez-vous.