Python Schulung – Kursbezug
Merksatz: Pandas ist „Excel für Code“ – wichtig ist nicht jedes Feature, sondern ein sicherer Workflow: laden → prüfen → bereinigen → auswerten.
Worum geht’s?
- DataFrames erstellen/lesen (
read_csv), Spalten prüfen, Datentypen verstehen. - Filtern, Sortieren, neue Spalten berechnen, Missing Values behandeln.
- Aggregation mit
groupby, Pivot-Tabellen, Joins (merge). - Einfaches Plotting (schnelle Visualisierung) – optional.
Lehr-/Lernziele
- (LZ1) einen DataFrame erstellen/laden und mit
head(),info(),describe()prüfen. - (LZ2) Daten bereinigen: fehlende Werte finden/ersetzen, Datentypen konvertieren, neue Spalten berechnen.
- (LZ3) Auswertungen bauen: Filtern/Sortieren,
groupby, Pivot, Kennzahlen pro Gruppe. - (LZ4) Daten kombinieren (
merge) und eine kleine Ergebnis-Tabelle/Visualisierung erzeugen.
Wie Sie die Ziele erreichen: Wir nutzen einen SemaTrain-Use-Case (Kursangebote, Orte, Formate – Beispielwerte). Das Quiz prüft LZ1–LZ4. Im Mini-Projekt bauen Sie eine Auswertung „Umsatz (Beispiel) nach Standort/Format“.
Setup (kurz)
# Installation (Beispiel):
# pip install pandas numpy matplotlib
import pandas as pd
import numpy as npNumPy: numerische Arrays und Kennzahlen
NumPy ergänzt Pandas dort, wo homogene Zahlenarrays und kompakte numerische Berechnungen im Mittelpunkt stehen. Für tabellarische Auswertungen bleibt in diesem Kapitel Pandas das Hauptwerkzeug.
import numpy as np
preise = np.array([
1390.0,
1490.0,
990.0,
1890.0,
])
print("Mittelwert:", np.mean(preise))
print("Standardabweichung:", np.std(preise))DataFrame: Erstellen & Prüfen
Wir starten mit Beispieldaten: Kurs, Standort, Format, Dauer, Preis.
import pandas as pd
daten = [
{"kurs": "Python Schulung", "standort": "Hamburg", "format": "Praesenz", "dauer_tage": 3, "preis_euro": 1490.00},
{"kurs": "Python Schulung", "standort": "Berlin", "format": "Online", "dauer_tage": 3, "preis_euro": 1390.00},
{"kurs": "Python Schulung", "standort": "Muenchen","format": "Praesenz", "dauer_tage": 4, "preis_euro": 1890.00},
{"kurs": "Python Schulung", "standort": "Koeln", "format": "Online", "dauer_tage": 2, "preis_euro": 990.00},
]
df = pd.DataFrame(daten)
print(df.head())
print(df.info())
print(df.describe(numeric_only=True))Bereinigung: Missing Values & neue Spalten
import pandas as pd
import numpy as np
daten = [
{"kurs": "Python Schulung", "standort": "Hamburg", "format": "Praesenz", "dauer_tage": 3, "preis_euro": 1490.00},
{"kurs": "Python Schulung", "standort": "Berlin", "format": "Online", "dauer_tage": 3, "preis_euro": None}, # fehlt
{"kurs": "Python Schulung", "standort": "Koeln", "format": "Online", "dauer_tage": 2, "preis_euro": 990.00},
]
df = pd.DataFrame(daten)
# 1) Missing Values prüfen
print(df.isna().sum())
# 2) Beispiel: fehlenden Preis mit Median ersetzen (Beispielregel)
median_preis = df["preis_euro"].median(skipna=True)
df["preis_euro"] = df["preis_euro"].fillna(median_preis)
# 3) Neue Spalte: Tagespreis
df["tagespreis_euro"] = df["preis_euro"] / df["dauer_tage"]
# 4) Typen (optional): dauer_tage als int
df["dauer_tage"] = df["dauer_tage"].astype(int)
print(df)Auswertung: Filtern, GroupBy, Pivot
Filtern & Sortieren
import pandas as pd
df = pd.DataFrame([
{"standort":"Hamburg","format":"Praesenz","dauer_tage":3,"preis_euro":1490.00},
{"standort":"Berlin","format":"Online","dauer_tage":3,"preis_euro":1390.00},
{"standort":"Muenchen","format":"Praesenz","dauer_tage":4,"preis_euro":1890.00},
{"standort":"Koeln","format":"Online","dauer_tage":2,"preis_euro": 990.00},
])
# Alle Praesenz-Kurse, nach Preis absteigend
praesenz = df[df["format"] == "Praesenz"].sort_values("preis_euro", ascending=False)
print(praesenz)groupby: Kennzahlen pro Gruppe
import pandas as pd
df = pd.DataFrame([
{"standort":"Hamburg","format":"Praesenz","teilnehmer":12,"preis_euro":1490.00},
{"standort":"Hamburg","format":"Praesenz","teilnehmer": 9,"preis_euro":1490.00},
{"standort":"Berlin","format":"Online","teilnehmer":15,"preis_euro":1390.00},
{"standort":"Berlin","format":"Online","teilnehmer":11,"preis_euro":1390.00},
])
# Beispiel: Umsatz (nicht verbindlich) = teilnehmer * preis
df["umsatz_beispiel"] = df["teilnehmer"] * df["preis_euro"]
auswertung = (
df.groupby(["standort","format"])
.agg(anzahl_termine=("teilnehmer","size"),
teilnehmer_summe=("teilnehmer","sum"),
umsatz_beispiel=("umsatz_beispiel","sum"))
.reset_index()
.sort_values("umsatz_beispiel", ascending=False)
)
print(auswertung)Pivot-Tabelle (kompakt)
import pandas as pd
df = pd.DataFrame([
{"standort":"Hamburg","format":"Praesenz","umsatz_beispiel":30000},
{"standort":"Hamburg","format":"Online","umsatz_beispiel":18000},
{"standort":"Berlin","format":"Online","umsatz_beispiel":26000},
])
pivot = pd.pivot_table(
df,
index="standort",
columns="format",
values="umsatz_beispiel",
aggfunc="sum",
fill_value=0
)
print(pivot)Daten kombinieren: merge (Join)
Typisch: Fakten-Tabelle (Termine) + Lookup-Tabelle (Standortregion, Ansprechpartner, etc.).
import pandas as pd
termine = pd.DataFrame([
{"standort":"Hamburg","format":"Praesenz","teilnehmer":12},
{"standort":"Berlin","format":"Online","teilnehmer":15},
])
standorte = pd.DataFrame([
{"standort":"Hamburg","region":"Nord"},
{"standort":"Berlin","region":"Ost"},
{"standort":"Muenchen","region":"Sued"},
])
df = termine.merge(standorte, on="standort", how="left")
print(df)Optional: schneller Plot
import pandas as pd
import matplotlib.pyplot as plt
auswertung = pd.DataFrame([
{"standort":"Hamburg","umsatz_beispiel":48000},
{"standort":"Berlin","umsatz_beispiel":52000},
{"standort":"Muenchen","umsatz_beispiel":61000},
])
ax = auswertung.set_index("standort")["umsatz_beispiel"].plot(kind="bar", title="Umsatz (Beispiel) je Standort")
ax.set_ylabel("EUR")
plt.tight_layout()
plt.show()Praxisaufgabe (Mini)
Sie bauen eine kleine Auswertung aus „Terminen“ (Beispieldaten) und geben eine Ranking-Tabelle aus.
Beitrag zu den Lehr-/Lernzielen: LZ1 (prüfen), LZ2 (bereinigen), LZ3 (groupby), LZ4 (merge/pivot optional).
- (LZ1) Erstellen Sie einen DataFrame
terminemit Spalten:standort,format,teilnehmer,preis_euro(Beispielwerte). - (LZ2) Fügen Sie absichtlich einen fehlenden Preis (
None) ein und ersetzen Sie ihn (z.B. mit Median). - (LZ3) Berechnen Sie
umsatz_beispiel = teilnehmer * preis_euround aggregieren Sie nachstandort. - (LZ3) Sortieren Sie die Standorte nach Umsatz absteigend und geben Sie Top 3 aus.
- (Bonus, LZ4) Mergen Sie eine Standort-Tabelle (Region) dazu.
Lösungsvorschlag anzeigen
import pandas as pd
termine = pd.DataFrame([
{"standort":"Hamburg","format":"Praesenz","teilnehmer":12,"preis_euro":1490.00},
{"standort":"Hamburg","format":"Praesenz","teilnehmer": 9,"preis_euro":1490.00},
{"standort":"Berlin","format":"Online","teilnehmer":15,"preis_euro":1390.00},
{"standort":"Berlin","format":"Online","teilnehmer":11,"preis_euro":None}, # fehlt
{"standort":"Muenchen","format":"Praesenz","teilnehmer":10,"preis_euro":1890.00},
])
# LZ1: prüfen
print(termine.head())
print(termine.isna().sum())
# LZ2: missing price füllen (Beispiel)
median_preis = termine["preis_euro"].median(skipna=True)
termine["preis_euro"] = termine["preis_euro"].fillna(median_preis)
# LZ3: Umsatz (Beispiel) berechnen + Aggregation
termine["umsatz_beispiel"] = termine["teilnehmer"] * termine["preis_euro"]
ranking = (
termine.groupby("standort")
.agg(teilnehmer_summe=("teilnehmer","sum"),
umsatz_beispiel=("umsatz_beispiel","sum"))
.reset_index()
.sort_values("umsatz_beispiel", ascending=False)
)
print("Ranking (Top 3):")
print(ranking.head(3))
# Bonus LZ4: merge Region
standorte = pd.DataFrame([
{"standort":"Hamburg","region":"Nord"},
{"standort":"Berlin","region":"Ost"},
{"standort":"Muenchen","region":"Sued"},
])
ranking_mit_region = ranking.merge(standorte, on="standort", how="left")
print(ranking_mit_region)Kurz-Takeaways
- LZ1: Erst prüfen:
head(),info(),describe(),isna(). - LZ2: Missing Values bewusst behandeln und Kennzahlen-Spalten berechnen.
- LZ3:
groupby + aggist der Kern vieler Auswertungen. - LZ4:
mergekombiniert Tabellen; Pivot/Plot für schnelle Sicht.