Fusion de données Pandas (merge / join)

Pandas offre de puissantes capacités de fusion de données permettant de joindre deux DataFrames ou plus en fonction de clés, tout comme SQL.mergeetjoinsont les deux méthodes les plus couramment utilisées.


Utilisation de base de merge

pd.merge()La fonction est utilisée pour fusionner deux DataFrames par colonnes, comme l'opération JOIN en SQL.

Fusion simple

Exemple

import pandas as pd

# Créer deux DataFrames
df1 = pd.DataFrame({
    "Student ID": ["S001", "S002", "S003"],
    "Nom": ["Zhang San", "Li Si", "Wang Wu"]
})

df2 = pd.DataFrame({
    "Student ID": ["S001", "S002", "S003"],
    "Mathématiques": [85, 92, 78]
})

print("DataFrame 1:")
print(df1)
print()

print("DataFrame 2:")
print(df2)
print()

# Fusion
result = pd.merge(df1, df2, on="Student ID")
print("Résultat de la fusion :")
print(result)

Fusion avec des noms de colonnes différents

Exemple

import pandas as pd

df1 = pd.DataFrame({
    "Student ID": ["S001", "S002", "S003"],
    "Nom": ["Zhang San", "Li Si", "Wang Wu"]
})

df2 = pd.DataFrame({
    "student_id": ["S001", "S002", "S003"],
    "Mathématiques": [85, 92, 78]
})

# Utiliser left_on et right_on
result = pd.merge(df1, df2, left_on="Student ID", right_on="student_id")
print("Fusionner avec des noms de colonnes différents :")
print(result)
print()

# Supprimer les colonnes redondantes
result = result.drop("student_id", axis=1)
print("Après avoir supprimé les colonnes redondantes :")
print(result)

Types de fusion

inner / left / right / outer

Exemple

import pandas as pd

df1 = pd.DataFrame({
    "Student ID": ["S001", "S002", "S003", "S004"],
    "Nom": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"]
})

df2 = pd.DataFrame({
    "Student ID": ["S001", "S002", "S003", "S005"],
    "Mathématiques": [85, 92, 78, 88]
})

print("DataFrame 1:")
print(df1)
print("\nDataFrame 2:")
print(df2)
print()

# jointure interne (par défaut) : ne garder que ce que les deux ont en commun
print("jointure interne (intersection) :")
print(pd.merge(df1, df2, on="Student ID", how="inner"))
print()

# jointure gauche : conserver toutes les lignes de la table de gauche
print("jointure gauche (conserver la table de gauche) :")
print(pd.merge(df1, df2, on="Student ID", how="left"))
print()

# jointure droite : conserver toutes les lignes de la table de droite
print("jointure droite (conserver la table de droite) :")
print(pd.merge(df1, df2, on="Student ID", how="right"))
print()

# jointure externe : conserver toutes les lignes
print("jointure externe (union) :")
print(pd.merge(df1, df2, on="Student ID", how="outer"))

Il est important de comprendre les différences entre les quatre types de JOIN : inner conserve l'intersection, left conserve toutes les lignes de la table de gauche, right conserve toutes les lignes de la table de droite, et outer conserve toutes les lignes des deux tables.


Fusion multi-clés

Exemple

import pandas as pd

df1 = pd.DataFrame({
    "City": ["Beijing", "Beijing", "Shanghai", "Shanghai"],
    "Year": [2023, 2024, 2023, 2024],
    "Ventes": [100, 120, 90, 110]
})

df2 = pd.DataFrame({
    "City": ["Beijing", "Beijing", "Shanghai", "Shanghai"],
    "Year": [2023, 2024, 2023, 2024],
    "Profit": [20, 25, 18, 22]
})

# Fusion multi-clés
result = pd.merge(df1, df2, on=["City", "Year"])
print("Fusion multi-clés :")
print(result)

Méthode join

DataFrame.join()C'est une autre méthode de fusion qui utilise par défaut une jointure à gauche (left join) et fusionne par index.

Fusion par index

Exemple

import pandas as pd

# Créer des données, définir l'index
df1 = pd.DataFrame({
    "Nom": ["Zhang San", "Li Si", "Wang Wu"],
    "Âge": [25, 30, 28]
}, index=["S001", "S002", "S003"])

df2 = pd.DataFrame({
    "Mathématiques": [85, 92, 78],
    "Anglais": [90, 88, 95]
}, index=["S001", "S002", "S003"])

print("DataFrame 1:")
print(df1)
print()

print("DataFrame 2:")
print(df2)
print()

# Utiliser join pour fusionner
result = df1.join(df2)
print("fusion join:")
print(result)

Fusion multi-tables

Exemple

import pandas as pd

df1 = pd.DataFrame({
    "Nom": ["Zhang San", "Li Si", "Wang Wu"]
}, index=["S001", "S002", "S003"])

df2 = pd.DataFrame({
    "Mathématiques": [85, 92, 78]
}, index=["S001", "S002", "S004"])

df3 = pd.DataFrame({
    "Anglais": [90, 88, 95]
}, index=["S001", "S003", "S004"])

# Jointure chaînée
result = df1.join(df2, how="left").join(df3, how="left")
print("Jointure multi-tables (left join):")
print(result)
print()

# Utiliser outer
result2 = df1.join(df2, how="outer").join(df3, how="outer")
print("Jointure multi-tables (jointure externe complète) :")
print(result2)

Exercice : Association multi-tables

Exemple

import pandas as pd

# Simuler des données métier
# 1. Table des employés
employees = pd.DataFrame({
    "ID de l'employé": ["E001", "E002", "E003", "E004"],
    "Nom": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"],
    "ID du département": ["D001", "D001", "D002", "D003"]
})

# 2. Table des départements
departments = pd.DataFrame({
    "ID du département": ["D001", "D002", "D003"],
    "Nom du département": ["Département Technologie", "Département des ventes", "Département des opérations"]
})

# 3. Table des salaires
salaries = pd.DataFrame({
    "ID de l'employé": ["E001", "E002", "E003", "E004"],
    "Salaire": [12000, 15000, 11000, 18000]
})

print(Étape 1 : Fusionner les employés et les départements)
result = pd.merge(employees, departments, on="ID du département")
print(result)
print()

print(Étape 2 : Ensuite, fusionner salaries)
result = pd.merge(result, salaries, on="ID de l'employé")
print(result)

Sélection entre merge et join

Comparaison merge join
Principe du merge Column Index
Join par défaut interne left
Scénarios applicables Merge par clé métier Merge par clé primaire/index

Dans la plupart des cas, merge est plus flexible, tandis que join est plus concis lors d'un merge par index. Choisissez la méthode appropriée en fonction de la structure de données réelle.

Autres extensions