Pandas Datenzusammenführung (merge / join)
Pandas bietet leistungsstarke Datenzusammenführungsfunktionen, mit denen zwei oder mehr DataFrames anhand von Schlüsseln verknüpft werden können, genau wie in SQL.mergeundjoinsind die beiden am häufigsten verwendeten Methoden.
Grundlegende Verwendung von merge
pd.merge()Die Funktion wird verwendet, um zwei DataFrames spaltenweise zusammenzuführen, ähnlich der JOIN-Operation in SQL.
Einfaches Zusammenführen
Beispiel
# Zwei DataFrames erstellen
df1 = pd.DataFrame({
"Student ID": ["S001", "S002", "S003"],
"Name": ["Zhang San", "Li Si", "Wang Wu"]
})
df2 = pd.DataFrame({
"Student ID": ["S001", "S002", "S003"],
"Mathematik": [85, 92, 78]
})
print("DataFrame 1:")
print(df1)
print()
print("DataFrame 2:")
print(df2)
print()
# Zusammenführen
result = pd.merge(df1, df2, on="Student ID")
print("Zusammenführungsergebnis:")
print(result)
Zusammenführen mit unterschiedlichen Spaltennamen
Beispiel
df1 = pd.DataFrame({
"Student ID": ["S001", "S002", "S003"],
"Name": ["Zhang San", "Li Si", "Wang Wu"]
})
df2 = pd.DataFrame({
"student_id": ["S001", "S002", "S003"],
"Mathematik": [85, 92, 78]
})
# Verwende left_on und right_on
result = pd.merge(df1, df2, left_on="Student ID", right_on="student_id")
print("Merge mit unterschiedlichen Spaltennamen:")
print(result)
print()
# Redundante Spalten entfernen
result = result.drop("student_id", axis=1)
print("Nach dem Entfernen redundanter Spalten:")
print(result)
Merge-Typen
inner / left / right / outer
Beispiel
df1 = pd.DataFrame({
"Student ID": ["S001", "S002", "S003", "S004"],
"Name": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"]
})
df2 = pd.DataFrame({
"Student ID": ["S001", "S002", "S003", "S005"],
"Mathematik": [85, 92, 78, 88]
})
print("DataFrame 1:")
print(df1)
print("\nDataFrame 2:")
print(df2)
print()
# Inner Join (Standard): nur behalten, was beide haben
print("Inner Join (Schnittmenge):")
print(pd.merge(df1, df2, on="Student ID", how="inner"))
print()
# Left Join: alle Zeilen aus der linken Tabelle behalten
print("Left Join (linke Tabelle behalten):")
print(pd.merge(df1, df2, on="Student ID", how="left"))
print()
# Right Join: alle Zeilen aus der rechten Tabelle behalten
print("Right Join (rechte Tabelle behalten):")
print(pd.merge(df1, df2, on="Student ID", how="right"))
print()
# Outer Join: alle Zeilen behalten
print("Outer Join (Vereinigung):")
print(pd.merge(df1, df2, on="Student ID", how="outer"))
Es ist wichtig, die Unterschiede zwischen den vier JOIN-Typen zu verstehen: Inner behält die Schnittmenge, Left behält alle Zeilen aus der linken Tabelle, Right behält alle Zeilen aus der rechten Tabelle, und Outer behält alle Zeilen aus beiden Tabellen.
Multi-Key-Zusammenführung
Beispiel
import pandas as pd
df1 = pd.DataFrame({
"City": ["Beijing", "Beijing", "Shanghai", "Shanghai"],
"Year": [2023, 2024, 2023, 2024],
"Verkäufe": [100, 120, 90, 110]
})
df2 = pd.DataFrame({
"City": ["Beijing", "Beijing", "Shanghai", "Shanghai"],
"Year": [2023, 2024, 2023, 2024],
"Profit": [20, 25, 18, 22]
})
# Multi-Key-Zusammenführung
result = pd.merge(df1, df2, on=["City", "Year"])
print("Multi-Key-Zusammenführung:")
print(result)
join-Methode
Beispiel
df1 = pd.DataFrame({
"City": ["Beijing", "Beijing", "Shanghai", "Shanghai"],
"Year": [2023, 2024, 2023, 2024],
"Verkäufe": [100, 120, 90, 110]
})
df2 = pd.DataFrame({
"City": ["Beijing", "Beijing", "Shanghai", "Shanghai"],
"Year": [2023, 2024, 2023, 2024],
"Profit": [20, 25, 18, 22]
})
# Multi-Key-Zusammenführung
result = pd.merge(df1, df2, on=["City", "Year"])
print("Multi-Key-Zusammenführung:")
print(result)
DataFrame.join()Es handelt sich um eine weitere Zusammenführungsmethode, die standardmäßig einen Left Join verwendet und nach Index zusammenführt.
Zusammenführen nach Index
Beispiel
# Daten erstellen, den Index setzen
df1 = pd.DataFrame({
"Name": ["Zhang San", "Li Si", "Wang Wu"],
"Alter": [25, 30, 28]
}, index=["S001", "S002", "S003"])
df2 = pd.DataFrame({
"Mathematik": [85, 92, 78],
"Englisch": [90, 88, 95]
}, index=["S001", "S002", "S003"])
print("DataFrame 1:")
print(df1)
print()
print("DataFrame 2:")
print(df2)
print()
# Verwende join zum Zusammenführen
result = df1.join(df2)
print("Join-Zusammenführung:")
print(result)
Multi-Tabellen-Zusammenführung
Beispiel
df1 = pd.DataFrame({
"Name": ["Zhang San", "Li Si", "Wang Wu"]
}, index=["S001", "S002", "S003"])
df2 = pd.DataFrame({
"Mathematik": [85, 92, 78]
}, index=["S001", "S002", "S004"])
df3 = pd.DataFrame({
"Englisch": [90, 88, 95]
}, index=["S001", "S003", "S004"])
# Verketteter Join
result = df1.join(df2, how="left").join(df3, how="left")
print("Multi-Tabellen-Join (Left Join):")
print(result)
print()
# Verwende outer
result2 = df1.join(df2, how="outer").join(df3, how="outer")
print("Mehrtabellen-Join (Full Outer Join):")
print(result2)
Übung: Mehrtabellen-Assoziation
Beispiel
# Geschäftsdaten simulieren
# 1. Mitarbeitertabelle
employees = pd.DataFrame({
"Mitarbeiter-ID": ["E001", "E002", "E003", "E004"],
"Name": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"],
"Abteilungs-ID": ["D001", "D001", "D002", "D003"]
})
# 2. Abteilungstabelle
departments = pd.DataFrame({
"Abteilungs-ID": ["D001", "D002", "D003"],
"Abteilungsname": ["Technologieabteilung", "Vertriebsabteilung", "Betriebsabteilung"]
})
# 3. Gehaltstabelle
salaries = pd.DataFrame({
"Mitarbeiter-ID": ["E001", "E002", "E003", "E004"],
"Salary": [12000, 15000, 11000, 18000]
})
print(Schritt 1: Mitarbeiter und Abteilungen zusammenführen)
result = pd.merge(employees, departments, on="Abteilungs-ID")
print(result)
print()
print(Schritt 2: Dann Gehälter zusammenführen)
result = pd.merge(result, salaries, on="Mitarbeiter-ID")
print(result)
Auswahl: merge vs. join
| Comparison | merge | join |
|---|---|---|
| Merge-Basis | Column | Index |
| Standard-join | innere | left |
| Anwendbare Szenarien | Merge nach Business-Key | Merge nach Primärschlüssel/Index |
Andere ErweiterungenIn den meisten Fällen ist merge flexibler, während join beim Zusammenführen nach Index prägnanter ist. Wählen Sie die geeignete Methode basierend auf der tatsächlichen Datenstruktur.