Aller au contenu principal

Combiner des DataFrames

Utilisez merge pour relier des lignes par des clés et concat pour empiler ou aligner des objets entiers. La question essentielle n'est pas la syntaxe, mais la relation attendue.

Joindre délibérément

import pandas as pd

orders = pd.DataFrame({"order_id": [1, 2, 3], "customer_id": ["A", "A", "B"]})
customers = pd.DataFrame({"customer_id": ["A", "C"], "name": ["Ada", "Lin"]})
result = orders.merge(
customers,
on="customer_id",
how="left",
validate="many_to_one",
indicator=True,
suffixes=("_order", "_customer"),
)

Cardinalité

Choisissez le contrat validate avant d'examiner le résultat :

  • one_to_one : les clés des deux côtés sont uniques.
  • one_to_many : la clé de gauche est unique.
  • many_to_one : la clé de droite est unique.
  • many_to_many : les doublons sont attendus ; vérifiez explicitement la taille du résultat.

Des clés dupliquées inattendues peuvent multiplier les lignes et fausser les agrégats. Vérifiez leur unicité avant la fusion lorsque la relation appartient au contrat de données.

Diagnostiquer les clés sans correspondance

Avec indicator=True, examinez les valeurs de _merge (left_only, right_only, both). Ne supprimez pas simplement l'indicateur sans expliquer les enregistrements non appariés.

Contrairement aux jointures SQL habituelles, Pandas associe les clés nulles entre elles lors d'une fusion. Supprimez, remplissez ou isolez-les d'abord si cette correspondance n'a pas de sens.

Concaténer

january, february = orders.iloc[:2], orders.iloc[2:]
features = orders[["order_id"]]
labels = pd.Series([1, 0, 1], index=orders.index)
rows = pd.concat([january, february], ignore_index=True)
columns = pd.concat([features, labels.rename("target")], axis="columns")

La concaténation de lignes aligne les colonnes ; celle de colonnes aligne les index. N'utilisez ignore_index=True que si les anciennes étiquettes de lignes n'ont aucun sens. Ajoutez keys= si la partition d'origine doit rester traçable.

Jointures temporelles

Utilisez merge_asof pour les jointures temporelles sur la clé la plus proche après avoir trié cette clé. Précisez direction et tolérance afin que « la plus proche » ne devienne pas silencieusement arbitraire.

Types de jointure et multiplication des lignes

L’API merge renvoie un nouveau DataFrame. La jointure gauche conserve ici trois commandes : noms Ada, Ada, manquant, et _merge égal à both, both, left_only. Elle ne révèle pas les clients sans commande ; une jointure externe expose C comme right_only. Une jointure interne ne garde que les clés correspondantes (deux lignes ici), une droite préserve les clés de droite et une externe leur union.

Une clé présente deux fois à gauche et trois fois à droite produit six lignes. validate="many_to_many" ne vérifie aucune unicité et ne protège pas la taille. Répéter A dans customers fait lever pd.errors.MergeError par le contrôle many_to_one de l’exemple. Précisez on= pour éviter une jointure involontaire sur tous les noms de colonnes communs.

Sources

Explorer les liensOuvrir le réseau