Python Tutorial für Data Science: Datenhandling mit pandas: Tidy Data & Transformationen

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-Join
  • concat: 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.