0Pricing
Pandas & NumPy Academy · Lektion

pd.merge: Inner- und Outer-Joins

Führen Sie zwei DataFrames über eine gemeinsame Schlüsselspalte mit Inner- und Outer-Joins zusammen und verstehen Sie, welche Zeilen erhalten bleiben oder entfallen.

pd.merge: Inner- und Outer-Joins ist eine kostenlose Pandas & NumPy Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Pandas & NumPy Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Pandas & NumPy Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist ein Join?

Ein Join kombiniert zwei DataFrames, indem Zeilen anhand einer gemeinsamen Schlüsselspalte abgeglichen werden – dasselbe Konzept wie die JOIN-Klausel in SQL. Pandas implementiert Joins über pd.merge(). Im Gegensatz zu pd.concat(), das Daten lediglich aneinanderhängt, richtet pd.merge() Zeilen aus zwei verschiedenen Tabellen anhand übereinstimmender Werte in einer oder mehreren Spalten intelligent aneinander aus.

Die gemeinsame Schlüsselspalte

Damit ein Merge funktioniert, benötigen beide DataFrames mindestens eine Spalte mit gemeinsamen Werten – die Schlüsselspalte. Eine Tabelle orders enthält beispielsweise eine Spalte customer_id, und auch eine Tabelle customers enthält eine Spalte customer_id. Durch das Zusammenführen über customer_id werden jeder Bestellzeile Kundendetails hinzugefügt. Wenn beide DataFrames denselben Spaltennamen verwenden, geben Sie den Schlüssel mit dem Parameter on an.

import pandas as pd

orders = pd.DataFrame({
    'order_id': [1, 2, 3, 4],
    'customer_id': [101, 102, 101, 103],
    'amount': [250, 80, 320, 150]
})

customers = pd.DataFrame({
    'customer_id': [101, 102, 104],
    'name': ['Alice', 'Bob', 'Diana']
})

Inner Join: Schnittmenge beider Tabellen

Ein Inner Join (der Standard) behält nur Zeilen, deren Schlüsselwert in beiden DataFrames vorhanden ist. Zeilen aus einer der beiden Tabellen, für deren Schlüssel es in der anderen Tabelle keine Übereinstimmung gibt, werden stillschweigend entfernt. Im Beispiel mit den Bestellungen gibt es für die Kunden 103 und 104 keine Übereinstimmung in der jeweils anderen Tabelle, daher werden ihre Zeilen aus dem Ergebnis des Inner Joins ausgeschlossen.

# Inner join (default): only matching rows from both
result = pd.merge(orders, customers, on='customer_id', how='inner')
print(result)
#    order_id  customer_id  amount   name
# 0         1          101     250  Alice
# 1         3          101     320  Alice
# 2         2          102      80    Bob
# Order 4 (customer 103) dropped - no match in customers
# Diana (customer 104) dropped - no match in orders

Outer Join: Vereinigung beider Tabellen

Ein Outer Join (how='outer') behält alle Zeilen aus beiden DataFrames. Wenn eine Zeile keinen passenden Schlüssel in der jeweils anderen Tabelle besitzt, werden die fehlenden Spalten mit NaN gefüllt. Das ist hilfreich, wenn Sie ein vollständiges Bild beider Datensätze erhalten und auch Datensätze beibehalten möchten, für die keine Übereinstimmung gefunden wurde.

result = pd.merge(orders, customers, on='customer_id', how='outer')
print(result)
#    order_id  customer_id  amount   name
# 0       1.0          101   250.0  Alice
# 1       3.0          101   320.0  Alice
# 2       2.0          102    80.0    Bob
# 3       4.0          103   150.0    NaN  <- order with unknown customer
# 4       NaN          104     NaN  Diana  <- customer with no orders

Zusammenführen von Spalten mit unterschiedlichen Namen

Wenn die Schlüsselspalte in den beiden DataFrames unterschiedlich heißt, verwenden Sie anstelle von on die Parameter left_on und right_on. Pandas gleicht Zeilen ab, bei denen left_on im linken DataFrame dem Wert von right_on im rechten DataFrame entspricht. Beide Schlüsselspalten erscheinen im Ergebnis; die überflüssige Spalte können Sie anschließend entfernen.

products = pd.DataFrame({
    'prod_id': [10, 20, 30],
    'name': ['Widget', 'Gadget', 'Doohickey']
})

order_lines = pd.DataFrame({
    'item_id': [10, 10, 20],
    'qty': [3, 1, 5]
})

result = pd.merge(order_lines, products,
                  left_on='item_id', right_on='prod_id')
print(result.drop(columns='prod_id'))
#    item_id  qty    name
# 0       10    3  Widget
# 1       10    1  Widget
# 2       20    5  Gadget

Zusammenführen über mehrere Spalten

Um Zeilen anhand einer Kombination von Spalten (eines zusammengesetzten Schlüssels) abzugleichen, übergeben Sie eine Liste an on. Das ist üblich, wenn eine einzelne Spalte keine eindeutige Zuordnung ermöglicht, etwa beim Zusammenführen über year und region. Alle angegebenen Spalten müssen gleichzeitig übereinstimmen, damit eine Zeile in das Ergebnis aufgenommen wird.

targets = pd.DataFrame({
    'year': [2023, 2023, 2024],
    'region': ['East', 'West', 'East'],
    'target': [100, 150, 120]
})
actuals = pd.DataFrame({
    'year': [2023, 2024, 2024],
    'region': ['East', 'East', 'West'],
    'actual': [95, 115, 80]
})

result = pd.merge(targets, actuals, on=['year', 'region'], how='inner')
print(result)
#    year region  target  actual
# 0  2023   East     100      95
# 1  2024   East     120     115

Umgang mit überlappenden Spaltennamen

Wenn beide DataFrames eine Spalte mit demselben Namen besitzen (außer dem Schlüssel), fügt Pandas Suffixe an, um sie zu unterscheiden. Standardmäßig sind dies _x (links) und _y (rechts). Mit dem Parameter suffixes können Sie diese anpassen, aussagekräftigere Namen erzeugen und Verwechslungen im Ergebnis vermeiden.

df_a = pd.DataFrame({'id': [1, 2], 'value': [10, 20]})
df_b = pd.DataFrame({'id': [1, 2], 'value': [100, 200]})

# Default suffixes
print(pd.merge(df_a, df_b, on='id'))
#    id  value_x  value_y

# Custom suffixes
print(pd.merge(df_a, df_b, on='id', suffixes=('_budget', '_actual')))
#    id  value_budget  value_actual

Unerwartete Duplikate prüfen

Eine häufige Falle beim Merge ist eine unerwartete Vervielfachung von Zeilen. Wenn die Schlüsselspalte in beiden DataFrames doppelte Werte enthält, erzeugt der Merge für alle übereinstimmenden Zeilen ein kartesisches Produkt. Prüfen Sie nach einem Merge immer die Zeilenanzahl: Wenn sie größer als erwartet ist, untersuchen Sie Duplikate in der Schlüsselspalte mit df.duplicated(subset=['key']).sum().

# Both tables have duplicate keys -> cartesian product
left = pd.DataFrame({'id': [1, 1], 'val_l': ['a', 'b']})
right = pd.DataFrame({'id': [1, 1], 'val_r': ['x', 'y']})

result = pd.merge(left, right, on='id')
print(len(result))  # 4 rows! (2x2 cartesian product)
print(result)
#    id val_l val_r
# 0   1     a     x
# 1   1     a     y
# 2   1     b     x
# 3   1     b     y

Sicherheit durch den Parameter validate

Übergeben Sie den Parameter validate, um Beziehungseinschränkungen für den Merge durchzusetzen und bei deren Verletzung einen Fehler auszulösen. 'one_to_one' erfordert eindeutige Schlüssel in beiden Tabellen, 'one_to_many' nur eindeutige Schlüssel in der linken Tabelle und 'many_to_one' nur in der rechten. Das ist eine ausgezeichnete defensive Programmierpraxis, die Probleme mit der Datenqualität frühzeitig erkennt.

# Safe merge: validate that customer_id is unique in customers
try:
    result = pd.merge(orders, customers,
                      on='customer_id',
                      how='inner',
                      validate='many_to_one')
    print('Merge OK, shape:', result.shape)
except Exception as e:
    print('Merge error:', e)

Abdeckung mit indicator prüfen

Übergeben Sie indicator=True, um dem Ergebnis eine Spalte _merge hinzuzufügen, die zeigt, woher jede Zeile stammt: 'left_only', 'right_only' oder 'both'. Das ist nach einem Outer Join hilfreich, um zu erkennen, welche Datensätze eine Übereinstimmung gefunden haben und welche nicht. So können Sie die Datenqualität prüfen, bevor Sie die Indikatorspalte entfernen.

result = pd.merge(orders, customers, on='customer_id',
                  how='outer', indicator=True)
print(result['_merge'].value_counts())
# both           3
# left_only      1  <- orders with no customer record
# right_only     1  <- customers with no orders

# Find unmatched orders
print(result[result['_merge'] == 'left_only'])

Zusammenfassung: Inner gegenüber Outer

Zusammengefasst gilt für die beiden Join-Typen: Ein Inner Join liefert die Schnittmenge – nur Zeilen mit übereinstimmenden Schlüsseln in beiden DataFrames. Ein Outer Join liefert die Vereinigung – alle Zeilen aus beiden DataFrames, wobei bei fehlender Übereinstimmung NaN eingetragen wird. Der Vollständigkeit halber: Ein Left Join behält alle Zeilen aus dem linken DataFrame, ein Right Join alle Zeilen aus dem rechten DataFrame. Diese Themen werden in der nächsten Lektion behandelt.

# Quick reference
# how='inner'  -> intersection: only matched rows
# how='outer'  -> union: all rows from both, NaN for no match
# how='left'   -> all left rows + matched right rows
# how='right'  -> all right rows + matched left rows

# Most common: inner (default) for enrichment, left for preserving records

Kurze Überprüfung

Testen Sie Ihr Verständnis der Inner- und Outer-Joins mit pd.merge() aus dieser Lektion.

Zusammenfassung der Lektion

In dieser Lektion haben Sie gelernt: pd.merge() mit how='inner' behält nur übereinstimmende Zeilen aus beiden DataFrames, während how='outer' alle Zeilen behält und für nicht übereinstimmende Zeilen NaN einträgt; on gibt den gemeinsamen Schlüssel an, während left_on/right_on unterschiedliche Spaltennamen verarbeiten; und der Parameter indicator hilft dabei zu prüfen, welche Zeilen übereinstimmen. Als Nächstes untersuchen wir Left und Right Joins, um alle Zeilen einer Seite beizubehalten.

Häufig gestellte Fragen

Ist die Lektion „pd.merge: Inner- und Outer-Joins“ kostenlos?

Ja — der vollständige Text von „pd.merge: Inner- und Outer-Joins“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Pandas & NumPy Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Pandas & NumPy Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „pd.merge: Inner- und Outer-Joins“?

Führen Sie zwei DataFrames über eine gemeinsame Schlüsselspalte mit Inner- und Outer-Joins zusammen und verstehen Sie, welche Zeilen erhalten bleiben oder entfallen. Du übst Pandas & NumPy Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Pandas & NumPy Academy zu starten?

Keine Vorkenntnisse erforderlich. Pandas & NumPy Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „pd.merge: Inner- und Outer-Joins“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Pandas & NumPy Academy-Lektion Code schreiben und ausführen?

Ja. Jede Pandas & NumPy Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. pd.concat zum Stapeln von DataFrames
  2. pd.merge: Inner- und Outer-Joins
  3. Left- und Right-Joins
  4. Über den Index verknüpfen
← Zurück zu Pandas & NumPy Academy