Préciser le suffixe dans la méthode join Pandas

Suraj Joshi 30 janvier 2023
  1. Joindre deux DataFrames en utilisant la méthode DataFrame.join()
  2. Joindre des DataFrames avec un nom de colonne commun en utilisant la méthode DataFrame.join()
Préciser le suffixe dans la méthode join Pandas

Ce tutoriel explique comment nous pouvons joindre deux DataFrames dans des Pandas en utilisant la méthode DataFrame.join() et spécifier le suffixe lors de la jonction.

import pandas as pd

roll_no = [501, 502, 503, 504, 505]

student_df = pd.DataFrame(
    {
        "Name": ["Jennifer", "Travis", "Bob", "Emma", "Luna", "Anish"],
        "Gender": ["Female", "Male", "Male", "Female", "Female", "Male"],
        "Age": [17, 18, 17, 16, 18, 16],
    }
)

grades_df = pd.DataFrame(
    {
        "Roll No": [501, 502, 503, 504, 505, 506],
        "Grades": ["A", "B+", "A-", "A", "B", "A+"],
    }
)

print("Student DataFrame:")
print(student_df, "\n")

print("Grades DataFrame:")
print(grades_df)

Production :

Student DataFrame:
       Name  Gender  Age
0  Jennifer  Female   17
1    Travis    Male   18
2       Bob    Male   17
3      Emma  Female   16
4      Luna  Female   18
5     Anish    Male   16 

Grades DataFrame:
   Roll No Grades
0      501      A
1      502     B+
2      503     A-
3      504      A
4      505      B
5      506     A+

Nous allons expliquer la méthode DataFrame.join() en démontrant la jointure des DataFrame students_df et grades_df.

Joindre deux DataFrames en utilisant la méthode DataFrame.join()

import pandas as pd

roll_no = [501, 502, 503, 504, 505]

student_df = pd.DataFrame(
    {
        "Name": ["Jennifer", "Travis", "Bob", "Emma", "Luna", "Anish"],
        "Gender": ["Female", "Male", "Male", "Female", "Female", "Male"],
        "Age": [17, 18, 17, 16, 18, 16],
    }
)

grades_df = pd.DataFrame(
    {
        "Roll No": [501, 502, 503, 504, 505, 506],
        "Grades": ["A", "B+", "A-", "A", "B", "A+"],
    }
)

joined_df = student_df.join(grades_df)

print("Student DataFrame:")
print(student_df, "\n")

print("Grades DataFrame:")
print(grades_df, "\n")

print("Joined DataFrame:")
print(joined_df, "\n")

Production :

Student DataFrame:
       Name  Gender  Age
0  Jennifer  Female   17
1    Travis    Male   18
2       Bob    Male   17
3      Emma  Female   16
4      Luna  Female   18
5     Anish    Male   16 

Grades DataFrame:
   Roll No Grades
0      501      A
1      502     B+
2      503     A-
3      504      A
4      505      B
5      506     A+ 

Joined DataFrame:
       Name  Gender  Age  Roll No Grades
0  Jennifer  Female   17      501      A
1    Travis    Male   18      502     B+
2       Bob    Male   17      503     A-
3      Emma  Female   16      504      A
4      Luna  Female   18      505      B
5     Anish    Male   16      506     A+ 

Il relie le student_df et le grades_df, et crée le joined_df. Par défaut, la méthode join() utilise l’index des deux DataFrames pour les joindre. La méthode de jointure est Left Join par défaut. Ici, toutes les lignes du DataFrame de gauche, c’est-à-dire student_df, sont conservées dans le joined_df, et une ligne avec un DataFrame de droite ayant la même valeur d’index que la ligne du DataFrame de gauche est jointe et placée dans la même ligne.

Joindre des DataFrames avec un nom de colonne commun en utilisant la méthode DataFrame.join()

Si nous avons une colonne avec le même nom dans les deux DataFrames que nous essayons de joindre en utilisant la méthode DataFrame.join(), nous obtenons une erreur avec le message ValueError: columns overlap but no suffix specified. Nous pouvons définir les valeurs des paramètres lsuffix et rsuffix dans la méthode DataFrame.join() pour résoudre l’erreur.

import pandas as pd

roll_no = [501, 502, 503, 504, 505]

student_df = pd.DataFrame(
    {
        "Roll No": [501, 502, 503, 504, 505, 506],
        "Name": ["Jennifer", "Travis", "Bob", "Emma", "Luna", "Anish"],
        "Gender": ["Female", "Male", "Male", "Female", "Female", "Male"],
        "Age": [17, 18, 17, 16, 18, 16],
    }
)

grades_df = pd.DataFrame(
    {
        "Roll No": [501, 502, 503, 504, 505, 506],
        "Grades": ["A", "B+", "A-", "A", "B", "A+"],
    }
)

joined_df = student_df.join(grades_df, lsuffix="_left", rsuffix="_right")

print("Student DataFrame:")
print(student_df, "\n")

print("Grades DataFrame:")
print(grades_df, "\n")

print("Joined DataFrame:")
print(joined_df, "\n")

Production :

Student DataFrame:
   Roll No      Name  Gender  Age
0      501  Jennifer  Female   17
1      502    Travis    Male   18
2      503       Bob    Male   17
3      504      Emma  Female   16
4      505      Luna  Female   18
5      506     Anish    Male   16 

Grades DataFrame:
   Roll No Grades
0      501      A
1      502     B+
2      503     A-
3      504      A
4      505      B
5      506     A+ 

Joined DataFrame:
   Roll No_left      Name  Gender  Age  Roll No_right Grades
0           501  Jennifer  Female   17            501      A
1           502    Travis    Male   18            502     B+
2           503       Bob    Male   17            503     A-
3           504      Emma  Female   16            504      A
4           505      Luna  Female   18            505      B
5           506     Anish    Male   16            506     A+ 

Il joint grades_df à la droite de student_df. La méthode DataFrame.join() ne fusionne pas les DataFrames individuelles, c’est-à-dire que même si la colonne Roll No est commune aux deux DataFrames, elles seront placées comme des champs séparés après join(). Pour distinguer le nom de la colonne avec un nom commun, nous fournissons un suffixe pour les deux colonnes dans les DataFrames gauche et droite en utilisant les paramètres lsuffix et rsuffix.

Alternativement, nous pouvons aussi utiliser la méthode DataFrame.merge() pour résoudre le problème en passant le nom commun de la colonne comme paramètre on dans la méthode.

import pandas as pd

roll_no = [501, 502, 503, 504, 505]

student_df = pd.DataFrame(
    {
        "Roll No": [501, 502, 503, 504, 505, 506],
        "Name": ["Jennifer", "Travis", "Bob", "Emma", "Luna", "Anish"],
        "Gender": ["Female", "Male", "Male", "Female", "Female", "Male"],
        "Age": [17, 18, 17, 16, 18, 16],
    }
)

grades_df = pd.DataFrame(
    {
        "Roll No": [501, 502, 503, 504, 505, 506],
        "Grades": ["A", "B+", "A-", "A", "B", "A+"],
    }
)

merged_df = student_df.merge(grades_df, on="Roll No")

print("Student DataFrame:")
print(student_df, "\n")

print("Grades DataFrame:")
print(grades_df, "\n")

print("Merged DataFrame:")
print(merged_df, "\n")

Production :

Student DataFrame:
   Roll No      Name  Gender  Age
0      501  Jennifer  Female   17
1      502    Travis    Male   18
2      503       Bob    Male   17
3      504      Emma  Female   16
4      505      Luna  Female   18
5      506     Anish    Male   16 

Grades DataFrame:
   Roll No Grades
0      501      A
1      502     B+
2      503     A-
3      504      A
4      505      B
5      506     A+ 

Merged DataFrame:
   Roll No      Name  Gender  Age Grades
0      501  Jennifer  Female   17      A
1      502    Travis    Male   18     B+
2      503       Bob    Male   17     A-
3      504      Emma  Female   16      A
4      505      Luna  Female   18      B
5      506     Anish    Male   16     A+ 

Il fusionne les DataFrames student_df et grades_df en un seul DataFrame. Dans ce cas, la colonne Roll No sera fusionnée en une seule colonne pour les deux DataFrames.

Auteur: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn