Fonction pd.merge() de Pandas

Pandas 通用函数Fonctions courantes 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

import pandas as pd

# 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 :

  1. Les deux tables sont reliées par ladept_idcolonne, qui est leur colonne commune.
  2. 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.
  3. 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

import pandas as pd

# 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 commeNaN。
  • 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 avecNaN.

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

import pandas as pd

# 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 :

  • Utiliserleft_index=Trueetright_index=TrueVous pouvez utiliser l'index du DataFrame comme clé de jointure.
  • Passez une liste auonparamètre pour réaliser une fusion multi-clés ; toutes les clés doivent correspondre pour qu'un enregistrement soit conservé.
  • Setindicator=Truepour ajouter une colonne spéciale indiquant de quelle table provient chaque enregistrement (left_only, right_only, both).

Astuce : 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.

Pandas 常用函数Fonctions courantes de Pandas

Autres extensions