In der Arbeit mit pandas stößt man fast immer auf den Schritt der Datenbereinigung und Transformation. Dabei geht es darum, Rohdaten so aufzubereiten, dass sie für Analysen, Modelle oder Visualisierungen nutzbar werden.
Bevor wir loslegen, ein paar wichtige Begriffe:
- DataFrame: Die zentrale Datenstruktur in pandas. Eine zweidimensionale Tabelle mit Zeilen (Index) und Spalten (Labels).
- Index: Der „Adressraum“ der Zeilen. Er dient zur eindeutigen Identifikation, ähnlich wie eine Zeilen-ID in einer SQL-Tabelle.
- Transformation: Änderung der Struktur oder Werte in einem DataFrame, z. B. Spalten umbenennen, Werte normalisieren oder Tabellen „pivotieren“.
- Tidy Data: Ein Konzept, das besagt: jede Variable ist eine Spalte, jede Beobachtung eine Zeile, jeder Wert eine Zelle. Dieses Prinzip macht Daten leichter analysierbar.
Arbeiten mit Indexen und Hierarchien
Der Index ist das Fundament eines DataFrames. Standardmäßig ist es eine laufende Zahl, aber man kann ihn auch selbst definieren, z. B. durch eine Zeitspalte oder Kombination mehrerer Variablen.
Beispiel:
import pandas as pd
data = {
"Datum": ["2025-01-01", "2025-01-01", "2025-01-02"],
"Stadt": ["Berlin", "Hamburg", "Berlin"],
"Umsatz": [100, 80, 120]
}
df = pd.DataFrame(data)
# Index auf Datum und Stadt setzen
df = df.set_index(["Datum", "Stadt"])
print(df)
👉 Ergebnis: ein sogenannter MultiIndex, der hierarchisch aufgebaut ist (Datum → Stadt).
Spalten hinzufügen mit assign
Mit der Methode assign kannst du Spalten elegant hinzufügen, ohne den DataFrame direkt zu überschreiben.
df = df.assign(Umsatz_plus10=lambda x: x["Umsatz"] + 10)
print(df)
Vorteil: assign ist method chaining-freundlich (Methoden lassen sich sauber hintereinander schreiben).
Transformation mit pipe
Die Methode pipe erlaubt es, eigene Funktionen in einen DataFrame-Workflow einzubinden. Das verbessert Lesbarkeit und Wiederverwendbarkeit.
def add_discount(df, rate=0.1):
df["Umsatz_discounted"] = df["Umsatz"] * (1 - rate)
return df
df = df.pipe(add_discount, rate=0.2)
print(df)
Tabellen zusammenführen (merge, concat, join)
In der Praxis liegen Daten oft in mehreren Tabellen vor. pandas bietet flexible Möglichkeiten, sie zu kombinieren:
merge: Ähnlich wie ein SQL-Joinconcat: Stapeln von DataFrames (Zeilen oder Spalten)join: Schnelles Kombinieren anhand von Indexen
Beispiel merge:
kunden = pd.DataFrame({
"KundenID": [1, 2, 3],
"Name": ["Anna", "Bernd", "Clara"]
})
umsatz = pd.DataFrame({
"KundenID": [1, 1, 2],
"Umsatz": [100, 150, 200]
})
df = pd.merge(kunden, umsatz, on="KundenID", how="left")
print(df)Reshaping (melt, pivot)
Manchmal muss man Daten von „breit“ in „lang“ transformieren oder umgekehrt.
- Breitformat: Jede Variable hat eine eigene Spalte
- Langformat: Variablenwerte werden untereinander aufgelistet
👉 Das Konzept „Tidy Data“ bevorzugt oft das Langformat, weil viele Statistik- und ML-Bibliotheken damit besser arbeiten können.
Beispiel mit melt:
df = pd.DataFrame({
"Stadt": ["Berlin", "Hamburg"],
"Q1": [100, 90],
"Q2": [120, 95]
})
df_melted = df.melt(id_vars="Stadt", var_name="Quartal", value_name="Umsatz")
print(df_melted)
Beispiel mit pivot:
df_pivot = df_melted.pivot(index="Stadt", columns="Quartal", values="Umsatz")
print(df_pivot)
Takeaways
- Der Index ist mächtig: er strukturiert Daten und ermöglicht komplexe Hierarchien.
- Mit assign und pipe lassen sich saubere Transformation-Workflows aufbauen.
- merge, concat und join sind die zentralen Werkzeuge, um Tabellen zu kombinieren.
- melt und pivot sind essenziell, um Daten ins passende Format (tidy/breit/lang) zu bringen.