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
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Join | Zeilen zweier Tabellen nebeneinanderlegen, wo eine Spalte übereinstimmt | merge |
| Schlüssel | die Spalte, die beide Tabellen haben und über die Zeilen zusammenfinden | date |
| Left Join | alle Zeilen der ersten Tabelle behalten, mit oder ohne Partner | |
| Inner Join | nur Zeilen behalten, die auf beiden Seiten einen Partner haben | |
| Ohne Partner | eine Zeile, die in der anderen Tabelle nichts findet | |
| Eindeutig | in 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
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
docker exec jupyter cat feiertage.csvHier 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
| date | ausleihen | feiertag |
|---|---|---|
| 2025-04-18 | 166 | Karfreitag |
| 2025-04-19 | 247 | (leer) |
| 2025-04-21 | 232 | Ostermontag |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Verbinden und die Feiertage zeigen
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
# 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
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
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
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
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 1Hier 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.