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 npDataFrame: 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.