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
# 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
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
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
Exemple
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)
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
# 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
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
# 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 |
Autres extensionsDans 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.