Suffix in Pandas Join-Methode angeben

Suraj Joshi 30 Januar 2023
  1. Zwei DataFrames mit der Methode DataFrame.join() verbinden
  2. DataFrames mit einem gemeinsamen Spaltennamen mit der Methode DataFrame.join() verbinden
Suffix in Pandas Join-Methode angeben

Dieses Tutorial erklärt, wie man in Pandas mit der Methode DataFrame.join() zwei DataFrames zusammenfügen kann und dabei das Suffix angeben kann.

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)

Ausgabe:

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+

Wir erklären die Methode DataFrame.join(), indem wir das Join von students_df und grades_df DataFrame demonstrieren.

Zwei DataFrames mit der Methode DataFrame.join() verbinden

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")

Ausgabe

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+ 

Es werden student_df und grades_df verbunden und joined_df erzeugt. Standardmäßig verwendet die Methode join() den Index der beiden DataFrames, um sie zu verbinden. Die Join-Methode ist standardmäßig Left Join. Hier werden alle Zeilen des linken DataFrames, d. h. student_df, im joined_df gehalten, und eine Zeile im rechten DataFrame, die denselben Indexwert wie die Zeile im linken DataFrame hat, wird verbunden und in dieselbe Zeile gesetzt.

DataFrames mit einem gemeinsamen Spaltennamen mit der Methode DataFrame.join() verbinden

Wenn wir eine Spalte mit demselben Namen in beiden DataFrames haben, die wir mit der Methode DataFrame.join() verbinden wollen, erhalten wir einen Fehler mit der Meldung ValueError: columns overlap but no suffix specified. Wir können die Werte der Parameter lsuffix und rsuffix in der Methode DataFrame.join() setzen, um den Fehler zu beheben.

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")

Ausgabe:

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+ 

Es wird grades_df rechts von student_df angefügt. Die Methode DataFrame.join() führt die einzelnen DataFrames nicht zusammen, d. h. selbst wenn die Spalte Roll No beiden DataFrames gemeinsam ist, werden sie nach join() als separate Felder angezeigt. Um den Spaltennamen mit einem gemeinsamen Namen zu unterscheiden, geben wir Suffixe für beide Spalten im linken und rechten DataFrame mit den Parametern lsuffix und rsuffix an.

Alternativ können wir auch die Methode DataFrame.merge() verwenden, um das Problem zu lösen, indem wir den Namen der gemeinsamen Spalte als Parameter on in die Methode übergeben.

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")

Ausgabe:

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+ 

Es werden die DataFrames student_df und grades_df zu einem einzigen DataFrame zusammengeführt. In diesem Fall wird die Spalte Roll No in eine einzige Spalte für beide DataFrames zusammengeführt.

Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn