0Pricing
Pandas & NumPy Academy · Leçon

pd.merge : jointures internes et externes

Fusionnez deux DataFrames sur une colonne clé commune avec des jointures internes et externes, et comprenez quelles lignes sont conservées ou supprimées.

pd.merge : jointures internes et externes est une leçon Pandas & NumPy Academy gratuite sur CoddyKit. Ceci est la leçon 2 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 qu’un join ?

Un join combine deux DataFrames en faisant correspondre les lignes à partir d’une colonne clé commune — le même concept que la clause JOIN de SQL. Pandas implémente les join au moyen de pd.merge(). Contrairement à pd.concat(), qui empile simplement les données, pd.merge() aligne intelligemment les lignes de deux tables différentes en fonction de valeurs correspondantes dans une ou plusieurs colonnes.

La colonne clé commune

Pour qu’une fusion fonctionne, les deux DataFrames doivent avoir au moins une colonne contenant des valeurs communes — la colonne clé. Par exemple, une table orders possède une colonne customer_id, et une table customers possède également une colonne customer_id. La fusion sur customer_id ajoute les informations du client à chaque ligne de commande. Indiquez la clé avec le paramètre on lorsque les deux DataFrames partagent le même nom de colonne.

import pandas as pd

orders = pd.DataFrame({
    'order_id': [1, 2, 3, 4],
    'customer_id': [101, 102, 101, 103],
    'amount': [250, 80, 320, 150]
})

customers = pd.DataFrame({
    'customer_id': [101, 102, 104],
    'name': ['Alice', 'Bob', 'Diana']
})

Join interne : intersection des deux tables

Un join interne (le comportement par défaut) conserve uniquement les lignes dont la valeur clé existe dans les deux DataFrames. Les lignes de l’une ou l’autre table qui ne possèdent aucune clé correspondante dans l’autre table sont supprimées silencieusement. Dans l’exemple des commandes, les clients 103 et 104 n’ont aucune correspondance dans l’autre table ; leurs lignes sont donc exclues du résultat du join interne.

# Inner join (default): only matching rows from both
result = pd.merge(orders, customers, on='customer_id', how='inner')
print(result)
#    order_id  customer_id  amount   name
# 0         1          101     250  Alice
# 1         3          101     320  Alice
# 2         2          102      80    Bob
# Order 4 (customer 103) dropped - no match in customers
# Diana (customer 104) dropped - no match in orders

Join externe : union des deux tables

Un join externe (how='outer') conserve toutes les lignes des deux DataFrames. Lorsqu’une ligne ne possède aucune clé correspondante dans l’autre table, les colonnes manquantes sont remplies avec NaN. Cette méthode est utile lorsque vous souhaitez obtenir une vue complète des deux jeux de données, en conservant les enregistrements qui n’ont trouvé aucune correspondance.

result = pd.merge(orders, customers, on='customer_id', how='outer')
print(result)
#    order_id  customer_id  amount   name
# 0       1.0          101   250.0  Alice
# 1       3.0          101   320.0  Alice
# 2       2.0          102    80.0    Bob
# 3       4.0          103   150.0    NaN  <- order with unknown customer
# 4       NaN          104     NaN  Diana  <- customer with no orders

Fusionner des colonnes portant des noms différents

Lorsque la colonne clé porte un nom différent dans chaque DataFrame, utilisez left_on et right_on au lieu de on. Pandas fait correspondre les lignes lorsque left_on dans le DataFrame de gauche est égal à right_on dans le DataFrame de droite. Les deux colonnes clés apparaissent dans le résultat ; vous pouvez ensuite supprimer celle qui est redondante.

products = pd.DataFrame({
    'prod_id': [10, 20, 30],
    'name': ['Widget', 'Gadget', 'Doohickey']
})

order_lines = pd.DataFrame({
    'item_id': [10, 10, 20],
    'qty': [3, 1, 5]
})

result = pd.merge(order_lines, products,
                  left_on='item_id', right_on='prod_id')
print(result.drop(columns='prod_id'))
#    item_id  qty    name
# 0       10    3  Widget
# 1       10    1  Widget
# 2       20    5  Gadget

Fusionner sur plusieurs colonnes

Pour faire correspondre les lignes sur une combinaison de colonnes (une clé composée), transmettez une liste à on. Cette méthode est courante lorsqu’une seule colonne ne suffit pas à obtenir une correspondance unique, par exemple pour fusionner à la fois sur year et region. Toutes les colonnes indiquées doivent correspondre simultanément pour qu’une ligne soit incluse dans le résultat.

targets = pd.DataFrame({
    'year': [2023, 2023, 2024],
    'region': ['East', 'West', 'East'],
    'target': [100, 150, 120]
})
actuals = pd.DataFrame({
    'year': [2023, 2024, 2024],
    'region': ['East', 'East', 'West'],
    'actual': [95, 115, 80]
})

result = pd.merge(targets, actuals, on=['year', 'region'], how='inner')
print(result)
#    year region  target  actual
# 0  2023   East     100      95
# 1  2024   East     120     115

Gérer les noms de colonnes qui se chevauchent

Lorsque les deux DataFrames possèdent une colonne portant le même nom (autre que la clé), Pandas ajoute des suffixes pour les distinguer. Les valeurs par défaut sont _x (à gauche) et _y (à droite). Vous pouvez les personnaliser avec le paramètre suffixes afin d’obtenir des noms plus explicites et d’éviter toute confusion dans le résultat.

df_a = pd.DataFrame({'id': [1, 2], 'value': [10, 20]})
df_b = pd.DataFrame({'id': [1, 2], 'value': [100, 200]})

# Default suffixes
print(pd.merge(df_a, df_b, on='id'))
#    id  value_x  value_y

# Custom suffixes
print(pd.merge(df_a, df_b, on='id', suffixes=('_budget', '_actual')))
#    id  value_budget  value_actual

Vérifier les doublons inattendus

Un problème courant lors d’une fusion est la multiplication inattendue des lignes. Si la colonne clé contient des valeurs dupliquées dans les deux DataFrames, la fusion produit le produit cartésien de toutes les lignes correspondantes. Vérifiez toujours le nombre de lignes après une fusion : s’il est supérieur à vos prévisions, recherchez les doublons dans la colonne clé avec df.duplicated(subset=['key']).sum().

# Both tables have duplicate keys -> cartesian product
left = pd.DataFrame({'id': [1, 1], 'val_l': ['a', 'b']})
right = pd.DataFrame({'id': [1, 1], 'val_r': ['x', 'y']})

result = pd.merge(left, right, on='id')
print(len(result))  # 4 rows! (2x2 cartesian product)
print(result)
#    id val_l val_r
# 0   1     a     x
# 1   1     a     y
# 2   1     b     x
# 3   1     b     y

Le paramètre validate pour plus de sécurité

Transmettez le paramètre validate pour imposer des contraintes de relation lors de la fusion et déclencher une erreur si elles ne sont pas respectées. 'one_to_one' exige des clés uniques dans les deux tables, 'one_to_many' exige des clés uniques uniquement dans la table de gauche, et 'many_to_one' uniquement dans celle de droite. Il s’agit d’une excellente pratique de programmation défensive, qui permet de détecter rapidement les problèmes de qualité des données.

# Safe merge: validate that customer_id is unique in customers
try:
    result = pd.merge(orders, customers,
                      on='customer_id',
                      how='inner',
                      validate='many_to_one')
    print('Merge OK, shape:', result.shape)
except Exception as e:
    print('Merge error:', e)

Vérifier la couverture avec indicator

Transmettez indicator=True pour ajouter au résultat une colonne _merge indiquant l’origine de chaque ligne : 'left_only', 'right_only' ou 'both'. Cette option est utile après un join externe pour identifier les enregistrements qui ont trouvé une correspondance et ceux qui n’en ont pas trouvé, et ainsi contrôler la qualité des données avant de supprimer la colonne d’indication.

result = pd.merge(orders, customers, on='customer_id',
                  how='outer', indicator=True)
print(result['_merge'].value_counts())
# both           3
# left_only      1  <- orders with no customer record
# right_only     1  <- customers with no orders

# Find unmatched orders
print(result[result['_merge'] == 'left_only'])

Résumé : interne ou externe

Pour résumer les deux types de join : le join interne fournit l’intersection — uniquement les lignes dont les clés correspondent dans les deux DataFrames. Le join externe fournit l’union — toutes les lignes des deux DataFrames, avec NaN lorsqu’il n’y a aucune correspondance. Pour être complet : le join gauche conserve toutes les lignes du DataFrame de gauche, et le join droit conserve toutes les lignes du DataFrame de droite. Ces notions seront abordées dans la prochaine leçon.

# Quick reference
# how='inner'  -> intersection: only matched rows
# how='outer'  -> union: all rows from both, NaN for no match
# how='left'   -> all left rows + matched right rows
# how='right'  -> all right rows + matched left rows

# Most common: inner (default) for enrichment, left for preserving records

Vérification rapide

Vérifiez votre compréhension des join internes et externes de pd.merge présentés dans cette leçon.

Récapitulatif de la leçon

Dans cette leçon, vous avez appris que pd.merge() avec how='inner' conserve uniquement les lignes correspondantes des deux DataFrames, tandis que how='outer' conserve toutes les lignes, avec NaN pour les lignes sans correspondance ; que on indique la clé commune, tandis que left_on/right_on gèrent les noms de colonnes différents ; et que le paramètre indicator permet de contrôler les lignes qui ont trouvé une correspondance. Nous allons maintenant découvrir les join gauche et droit, qui permettent de conserver toutes les lignes d’un côté.

Questions Fréquemment Posées

La leçon « pd.merge : jointures internes et externes » est-elle gratuite ?

Oui — le texte complet de « pd.merge : jointures internes et externes » 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 « pd.merge : jointures internes et externes » ?

Fusionnez deux DataFrames sur une colonne clé commune avec des jointures internes et externes, et comprenez quelles lignes sont conservées ou supprimées. 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 2 sur 4.

Combien de temps prend la leçon « pd.merge : jointures internes et externes » ?

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

  1. pd.concat pour empiler des DataFrames
  2. pd.merge : jointures internes et externes
  3. Jointures gauche et droite
  4. Effectuer une jointure sur l’index
← Retour à Pandas & NumPy Academy