Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Zwei Tabellen verbinden

Nach dieser Lektion: Ich kann zwei Tabellen über eine gemeinsame Spalte verbinden und prüfen, ob der Join getan hat, was ich wollte.

Lektion, 60 Min.7 BefehleJupyterLab-Lab für Data Science: pandas, Matplotlib und scikit-learn im Browser

Sind Feiertage ruhiger?

Der Fahrradverleih hat eine Tabelle mit Ausleihen und, getrennt davon, eine Liste der Feiertage. Der Besitzer fragt, ob es an Feiertagen ruhiger ist.

Keine der beiden Tabellen beantwortet das allein. Die Ausleihen haben keine Spalte „Feiertag“, und die Feiertagsliste hat keine Ausleihen. Man muss sie über das gemeinsame Datum verbinden.

Am Ende dieser Lektion

Notiz

Ich kann zwei Tabellen über eine gemeinsame Spalte verbinden und prüfen, ob der Join getan hat, was ich wollte.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
JoinZeilen zweier Tabellen nebeneinanderlegen, wo eine Spalte übereinstimmtmerge
Schlüsseldie Spalte, die beide Tabellen haben und über die Zeilen zusammenfindendate
Left Joinalle Zeilen der ersten Tabelle behalten, mit oder ohne Partner
Inner Joinnur Zeilen behalten, die auf beiden Seiten einen Partner haben
Ohne Partnereine Zeile, die in der anderen Tabelle nichts findet
Eindeutigin einer Spalte nur einmal vorhanden

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Zwei Tabellen, eine gemeinsame Spalte

Daten liegen oft in mehreren kleinen Tabellen, damit jede Tatsache nur einmal steht. Die Feiertagsliste steht einmal da und wird nicht auf 365 Zeilen kopiert.

Um beide zu nutzen, verbinden Sie sie. Sie wählen eine Spalte, die beide haben: den Schlüssel. Jede Zeile der einen sucht die Zeilen der anderen mit demselben Schlüsselwert.

Die zweite Tabelle anlegen

Drücken Sie in der Lektionsleiste auf Start und warten Sie, bis das Lab läuft. Das Terminal hat kein Python: Jeder Run startet einen Befehl im Lab mit docker exec jupyter.

Das Lab enthält nur hires.csv. Der erste Run schreibt eine zweite Datei, feiertage.csv, mit acht Feiertagen von 2025.

Die Feiertagsliste schreiben

Befehl
docker exec jupyter sh -c "printf '%s\n' 'date,feiertag' '2025-01-01,Neujahr' '2025-04-18,Karfreitag' '2025-04-21,Ostermontag' '2025-05-01,Tag der Arbeit' '2025-05-29,Christi Himmelfahrt' '2025-06-09,Pfingstmontag' '2025-10-03,Tag der Deutschen Einheit' '2025-12-25,Erster Weihnachtstag' > feiertage.csv"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Sie wieder lesen

Befehl
docker exec jupyter cat feiertage.csv

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Left Join behält jede Zeile

Ein Left Join geht von der ersten Tabelle aus. Jede ihrer Zeilen bleibt. Findet eine Zeile einen Partner, werden die neuen Spalten gefüllt. Sonst bleiben sie leer.

Das ist die sichere Wahl, um einer Tabelle Information hinzuzufügen. Eine Spalte hinzuzufügen kann keinen Tag verlieren.

Beispiel: drei Tage verbunden

dateausleihenfeiertag
2025-04-18166Karfreitag
2025-04-19247(leer)
2025-04-21232Ostermontag

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Verbinden und die Feiertage zeigen

Befehl
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('feiertage.csv'); j=h.merge(b, on='date', how='left'); print(len(h), len(b), len(j)); print(j['feiertag'].notna().sum()); print(j[j['feiertag'].notna()][['date','weekday','feiertag','hires']].to_string(index=False))"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Join von Hand in Python

Code: python
# Ein Join von Hand: jede Zeile der Ausleihen sucht ihr Datum bei den Feiertagen.
ausleihen = [["2025-04-18", 166], ["2025-04-19", 247], ["2025-04-21", 232]]
feiertage = {"2025-04-18": "Karfreitag", "2025-04-21": "Ostermontag"}
for zeile in ausleihen:
    name = "keiner"
    if zeile[0] in feiertage:
        name = feiertage[zeile[0]]
    print(zeile[0], zeile[1], name)
# Tragen Sie "2025-04-19": "Samstag" bei den Feiertagen ein und starten Sie noch einmal.

Left, Inner und Outer

Ein Inner Join behält nur die Zeilen, die auf beiden Seiten einen Partner haben. Ein Outer Join behält alle Zeilen beider Tabellen, mit oder ohne Partner.

Die Wahl ändert die Zeilenzahl und damit jede Zahl, die Sie danach ausrechnen. Sagen Sie, welchen Join Sie genommen haben und warum.

Die Zeilen jeder Join-Art zählen

Befehl
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('feiertage.csv'); print(len(h.merge(b, on='date', how='inner')), len(h.merge(b, on='date', how='left')), len(h.merge(b, on='date', how='outer')))"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Gruppieren, dann die Gruppengröße lesen

Stellen Sie nach dem Verbinden die Frage. Markieren Sie jeden Tag als Feiertag oder nicht, behalten Sie die Werktage und nehmen Sie den Mittelwert der Ausleihen je Gruppe.

Schauen Sie, wie viele Tage in jeder Gruppe sind. Ein Mittelwert über acht Tage ist ein viel schwächerer Beleg als einer über 253.

Feiertage und gewöhnliche Werktage vergleichen

Befehl
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('feiertage.csv'); j=h.merge(b, on='date', how='left'); j['ist_feiertag']=j['feiertag'].notna(); w=j[j['weekday'].isin(['Mon','Tue','Wed','Thu','Fri'])]; print(w.groupby('ist_feiertag')['hires'].agg(['count','mean']).round(1))"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein wiederholter Schlüssel vervielfacht Zeilen

Wiederholt sich der Schlüssel in der zweiten Tabelle, findet eine Zeile der ersten jede Kopie und wird für jede einmal geschrieben. Die Tabelle wächst, und jede Summe danach ist zu groß.

Pandas kann das prüfen. Geben Sie validate="one_to_one" an: Es bricht mit einem Fehler ab, wenn ein Schlüssel nicht eindeutig ist.

Einen Feiertag wiederholen und neu verbinden

Befehl
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('feiertage.csv'); b=pd.concat([b, b.iloc[[0]]]); print(len(h.merge(b, on='date', how='left')), b['date'].is_unique)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Pandas bitten, es abzulehnen

Befehl
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('feiertage.csv'); b=pd.concat([b, b.iloc[[0]]]); h.merge(b, on='date', how='left', validate='one_to_one')" 2>&1 | tail -n 1

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele denken, ein Left Join könne die Zeilenzahl nicht ändern. Er kann sie erhöhen. Er verliert nie eine Zeile der ersten Tabelle, aber ein wiederholter Schlüssel macht Kopien davon. Vergleichen Sie die Zeilenzahlen vorher und nachher.

Weiter: der Tag danach

Verbinden Sie in Ihrem Notebook die Feiertage noch einmal mit hires.csv. Berechnen Sie dann den Mittelwert der Ausleihen am Tag nach jedem Feiertag.

Hinweis: Addieren Sie vor dem Verbinden einen Tag zu jedem Feiertagsdatum mit pd.to_datetime(...) + pd.Timedelta(days=1). Sagen Sie zuerst, was Sie erwarten.

Über dieses Lab und seinen Quellcode: JupyterLab-Lab für Data Science: pandas, Matplotlib und scikit-learn im Browser

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.