Fonction pd.merge() de Pandas
pd.merge()est une fonction de la bibliothèque Pandas utilisée pourjoindre deux DataFrames par colonne. Elle est similaire à l'opération JOIN en SQL et peut fusionner deux tables de données en une seule sur la base d'une ou plusieurs colonnes communes.
Il s'agit de l'une des méthodes de fusion les plus couramment utilisées dans l'analyse et le traitement des données. Elle est particulièrement adaptée au traitement de données relationnelles, en intégrant ensemble des informations connexes dispersées dans différentes tables.
Explication du terme: mergesignifie « fusionner, combiner », ici il s'agit de fusionner deux tables de données ensemble sur la base d'une clé commune.
Syntaxe de base et paramètres
pd.merge()est une fonction de premier niveau de la bibliothèque Pandas, utilisée pour implémenter des opérations similaires à JOIN en SQL.
Format de syntaxe
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
Description du paramètre
- Paramètre:
left- Type : DataFrame.
- Description : Le DataFrame de gauche, la première table participant à la fusion.
- Paramètre:
right- Type : DataFrame.
- Description : Le DataFrame de droite, la seconde table participant à la fusion.
- Paramètre:
on- Type : chaîne de caractères ou liste de chaînes de caractères.
- Description : Le nom de colonne (clé) utilisé pour la jointure. Les DataFrames de gauche et de droite doivent avoir des colonnes portant le même nom. S'il n'est pas spécifié, il trouvera automatiquement les colonnes portant le même nom comme clé.
- Paramètre:
how- Type : chaîne de caractères ('left', 'right', 'outer', 'inner').
- Description : La méthode merge, similaire aux types de jointure SQL.
'inner'indique une jointure interne (intersection),'outer'indique une jointure externe (union),'left'indique une jointure gauche (conserve tous les enregistrements de la table de gauche),'right'indique une jointure droite (conserve tous les enregistrements de la table de droite).'inner'。
- Paramètre:
left_on- Type : chaîne de caractères ou liste de chaînes de caractères.
- Description : Le nom de la colonne dans le DataFrame de gauche utilisé comme clé de jointure. Utilisé lorsque les noms de colonne de clé de jointure des tables de gauche et de droite sont différents.
- Paramètre:
right_on- Type : chaîne de caractères ou liste de chaînes de caractères.
- Description : Le nom de la colonne dans le DataFrame de droite utilisé comme clé de jointure. Utilisé lorsque les noms de colonne de clé de jointure des tables de gauche et de droite sont différents.
- Paramètre:
suffixes- Type : Tuple.
- Description : Lorsque les tables de gauche et de droite ont des colonnes portant le même nom (pas des clés de jointure), les suffixes utilisés pour les distinguer. La valeur par défaut est
('_x', '_y')。
Description de la fonction
- Valeur de retour: Renvoie le DataFrame fusionné.
- Effet: Fusionne horizontalement deux DataFrames en un seul DataFrame selon la clé et la méthode spécifiées.
Exemples
Maîtrisons en profondeur, à travers une série d'exemples du simple au complexe,pd.merge()l'utilisation de.
Exemple 1 : Utilisation de base - Jointure interne basée sur une seule colonne
Exemple
# 1. Créer deux DataFrames
employees = pd.DataFrame({
'emp_id': [101, 102, 103, 104],
'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
'dept_id': [1, 2, 1, 2]
})
departments = pd.DataFrame({
'dept_id': [1, 2, 3],
'dept_name': ['Ingénierie', 'Ventes', 'Marketing']
})
print("=== Table des employés (employees) ===")
print(employees)
print("\n=== Table des départements (departments) ===")
print(departments)
# 2. Utiliser pd.merge() pour fusionner sur la colonne dept_id (jointure interne, par défaut)
result = pd.merge(employees, departments, on='dept_id')
print("\n=== pd.merge(employees, departments, on='dept_id') jointure interne ===")
print(result)
Résultat d'exécution attendu :
=== 员工表 (employees) === emp_id name dept_id 0 101 Alice 1 1 102 Bob 2 2 103 Charlie 1 3 104 Diana 2 === 部门表 (departments) === dept_id dept_name 0 1 Engineering 1 2 Sales 2 3 Marketing === pd.merge(employees, departments, on='dept_id') 内连接 === emp_id name dept_id dept_name 0 101 Alice 1 Engineering 1 103 Charlie 1 Engineering 2 102 Bob 2 Sales 3 104 Diana 2 Sales
Analyse du code :
- Les deux tables sont reliées par la
dept_idcolonne, qui est leur colonne commune. - La jointure interne est utilisée par défaut (
how='inner'), ne conservant que les valeurs de clé présentes des deux côtés (dept_id 1 et 2), donc le département Marketing avec dept_id 3 est exclu. - Après la fusion, chaque employé est associé au nom du département correspondant.
Exemple 2 : Jointure gauche et jointure droite
En utilisant lahowLe paramètre peut contrôler la méthode de fusion, en conservant tous les enregistrements d'un côté.
Exemple
# Continuer à utiliser les données ci-dessus
employees = pd.DataFrame({
'emp_id': [101, 102, 103, 104],
'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
'dept_id': [1, 2, 1, 2]
})
departments = pd.DataFrame({
'dept_id': [1, 2, 3],
'dept_name': ['Ingénierie', 'Ventes', 'Marketing']
})
# 1. Jointure gauche - conserver tous les enregistrements de la table de gauche
print("=== Jointure gauche (how='left') ===")
left_result = pd.merge(employees, departments, on='dept_id', how='left')
print(left_result)
# 2. Jointure droite - conserver tous les enregistrements de la table de droite
print("\n=== Jointure droite (how='right') ===")
right_result = pd.merge(employees, departments, on='dept_id', how='right')
print(right_result)
# 3. Jointure externe - conserver tous les enregistrements des deux tables
print("\n=== Jointure externe (how='outer') ===")
outer_result = pd.merge(employees, departments, on='dept_id', how='outer')
print(outer_result)
Résultat d'exécution attendu :
=== 左连接 (how='left') === emp_id name dept_id dept_name 0 101 Alice 1 Engineering 1 103 Charlie 1 Engineering 2 102 Bob 2 Sales 3 104 Diana 2 Sales === 右连接 (how='right') === emp_id name dept_id dept_name 0 101 Alice 1 Engineering 1 103 Charlie 1 Engineering 2 102 Bob 2 Sales 3 104 Diana 2 Sales 4 NaN NaN 3 Marketing === 外连接 (how='outer') === emp_id name dept_id dept_name 0 101 Alice 1 Engineering 1 103 Charlie 1 Engineering 2 102 Bob 2 Sales 3 104 Diana 2 Sales 4 NaN NaN 3 Marketing
Analyse du code :
- La jointure gauche conserve tous les enregistrements d'employés de la table de gauche (employees), et les départements sans correspondance dans la table de droite sont affichés comme
NaN。 - La jointure droite conserve tous les départements de la table de droite (departments), même si aucun employé n'appartient à ce département.
- La jointure externe conserve tous les enregistrements des deux tables, et les champs sans correspondance sont remplis avec
NaN.
Exemple 3 : Gestion de deux tables avec des noms de colonnes différents
Lorsque les noms des colonnes clés de jointure des deux tables sont différents, vous pouvez utiliser lesleft_onetright_onparamètres pour les spécifier séparément.
Exemple
# 1. Créer deux DataFrames avec des noms de colonnes différents
students = pd.DataFrame({
'student_id': [1, 2, 3, 4],
'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
'class_id': [101, 102, 101, 103]
})
classes = pd.DataFrame({
'class_id': [101, 102, 103],
'class_name': ['Classe A', 'Classe B', 'Classe C'],
'teacher': ['M. Smith', 'Mme Johnson', 'Mme Lee']
})
print("=== Tableau des étudiants ===")
print(students)
print("\n=== Tableau des classes ===")
print(classes)
# 2. Utiliser left_on et right_on pour gérer des noms de colonnes différents
result = pd.merge(students, classes, left_on='class_id', right_on='class_id')
print("\n=== Fusion avec des noms de colonnes différents ===")
print(result)
Résultat d'exécution attendu :
=== 学生表 ===
student_id name class_id
0 1 Alice 101
1 2 Bob 102
2 3 Charlie 101
3 4 Diana 103
=== 班级表 ===
class_id class_name teacher
0 101 Class A Mr. Smith
1 102 Class B Ms. Johnson
2 103 Class C Mrs. Lee
=== 不同列名时的合并 ===
student_id name class_id class_name teacher
0 1 Alice 101 Class A Mr. Smith
1 3 Charlie 101 Class A Mr. Smith
2 2 Bob 102 Class B Indicator False
3 indicator column
print("\n=== indicator=True 显示合并详情 ===")
print(result_indicator)
[/mycode4]</div>
</div>
<p><strong>运行结果预期:</strong></p>
<pre>
=== 索引作为连接键 ===
name city score subject grade
0 Alice Beijing 85 Math A
1 Bob Shanghai 90 Math B
2 Charlie Guangzhou 95 English A
3 Diana Shenzhen 88 English B
=== 多个键的合并 ===
student_id name course_id course_name score
0 1 Alice 101 Math 90
1 1 Alice 102 English 85
2 2 Bob 101 Math 88
3 2 Bob 103 Science 92
4 3 Charlie 102 English 95
=== indicator=True 显示合并详情 ===
name city merge_info
0 Alice Beijing both
1 Bob Shanghai both
2 Charlie Guangzhou left_only
3 Diana Shenzhen left_only
Analyse du code :
- Utiliser
left_index=Trueetright_index=TrueVous pouvez utiliser l'index du DataFrame comme clé de jointure. - Passez une liste au
onparamètre pour réaliser une fusion multi-clés ; toutes les clés doivent correspondre pour qu'un enregistrement soit conservé. - Set
indicator=Truepour ajouter une colonne spéciale indiquant de quelle table provient chaque enregistrement (left_only, right_only, both).
Autres extensionsAstuce :
pd.merge()convient aux opérations de fusion basées sur les colonnes. Si vous avez seulement besoin d'ajouter simplement des données verticalement (ajout de lignes), utilisez lepd.concat()fonction.
Fonctions courantes de Pandas