Partie 3 · Jointures
Joindre des tables : merge
Les données sont rarement dans une seule table. Une jointure aligne les lignes de deux tables grâce à une clé de jointure : des colonnes partagées, comme une clé primaire / clé étrangère en SQL. En pandas : pd.merge(gauche, droite, on='client_id', how='inner').
how | Lignes conservées | Sur l'exemple |
|---|---|---|
inner | clés présentes des deux côtés | clés 1 et 2 (Alice, Bob avec leurs commandes) |
left | toutes celles de gauche ; NaN si pas de correspondance | 1, 2, 3 (Charlie sans commande) |
right | toutes celles de droite | 1, 2, 4 (commande du client 4 sans nom) |
outer | toutes les lignes des deux tables | 1, 2, 3, 4 |
Une clé qui apparaît plusieurs fois à droite (client 2) donne plusieurs lignes dans le résultat. Paramètres : on (même nom des deux côtés), left_on / right_on (noms différents), suffixes (pour distinguer les colonnes homonymes non clés ; par défaut _x et _y).
Vérifie que tu as compris
Vérifie que tu as compris
client_id / id_client). Comment faire ?Une jointure en Python pur
On indexe la table de droite par la clé (dictionnaire de listes), puis on parcourt la gauche :
from collections import defaultdict par_client = defaultdict(list) for c in commandes: par_client[c["client_id"]].append(c) inner = [] for cl in clients: for cmd in par_client.get(cl["client_id"], []): inner.append({**cl, **cmd}) # fusion des deux dicts
Pour un left, on ajoute la ligne gauche seule (les champs de droite à None) quand la liste est vide.
À toi de coder
Les suffixes
Quand les deux tables ont une colonne de même nom (hors clé), pandas ajoute _x (gauche) et _y (droite), personnalisables avec suffixes=('_client', '_details'). En Python pur, {**gauche, **droite} écrase silencieusement la colonne de gauche : il faut renommer soi-même.
Vérifie que tu as compris
{**a, **b} si a et b ont tous deux une clé « ville » ?