Tabellen aufbauen#
Bei Datensätzen mit unterschiedlichen Datentypen (z. B. Text, Zahlen, Kategorien) stößt NumPy schnell an seine Grenzen. Das Paket Pandas bietet hier eine flexible und leistungsstarke Möglichkeit, strukturierte Daten in Tabellenform zu speichern und zu analysieren. Es ermöglicht:
Eine klare tabellarische Darstellung
Unterschiedliche Datentypen in den Spalten
Sinnvolle Benennung einzelner Spalten
Einfache Filterung, Gruppierung und Transformation von Daten
Tabellen erstellen und erweitern#
Ein \(\texttt{DataFrame}\) ist die zentrale Datenstruktur in Pandas vergleichbar mit einer Tabelle in Excel. Jede Spalte kann dabei unterschiedliche Datentypen enthalten, z. B. Zahlen, Texte, Datumswerte, solange jede Spalte die gleiche Anzahl an Einträgen hat. Als Beispiel betrachten wir einen Ausschnitt aus der Veranstaltungsübersicht der Uni Mannheim.
Veranstaltung |
Typ |
Raumgröße |
|---|---|---|
Stochastik I |
Vorlesung |
150 |
Lineare Algebra I |
Vorlesung |
150 |
Produktion |
Vorlesung |
300 |
Ökonometrie |
Übung |
40 |
In Pandas können Sie diese Tabelle wie folgt reproduzieren:
import pandas as pd
veranstaltungen = pd.DataFrame({
# Spaltenname Liste mit Werten für jede Veranstaltung
'Veranstaltung': ['Stochastik I', 'Lineare Algebra I', 'Produktion', 'Ökonometrie'],
'Typ': ['Vorlesung', 'Vorlesung', 'Vorlesung', 'Übung'],
'Raumgröße': [150, 150, 300, 40]
# Wichtig: Alle Listen müssen gleich lang sein
})
print(veranstaltungen)
Der Befehl \(\texttt{pd.DataFrame()}\) benötigt eine Sammlung von Spaltennamen und den dazugehörigen Daten um eine Tabelle zu erstellen.
Man gibt zuerst für jede Spalte einen Namen an, z. B. “Veranstaltung” oder “Raumgröße” an,
und ordnet diesem Namen eine Liste mit Werten zu – also z. B. alle Veranstaltungsnamen oder die jeweiligen Raumgrößen.
So entsteht eine strukturierte Tabelle, bei der jede Zeile für eine Beobachtung steht (hier: eine Veranstaltung) und jede Spalte eine bestimmte Information über diese Beobachtungen enthält. In unserem Beispiel bauen wir eine Tabelle mit Lehrveranstaltungen auf. Jede Zeile steht für eine Veranstaltung. Die Spalten geben den Titel, den Veranstaltungstyp und die Größe des Raums an.
Aufgabe 1.1
Reproduzieren Sie die folgende Tabelle und nennen Sie sie \(\texttt{studierende}\).
Name |
Fachsemester |
Studiengang |
|---|---|---|
Anna |
2 |
Wima |
Berkan |
4 |
VWL |
Clara |
1 |
Wima |
Daniel |
3 |
BWL |
# Ihr Code
Hinweis
Nutzen Sie \(\texttt{pd.DataFrame()}\) und übergeben Sie die Spaltennamen als String und den Spalteninhalt als Liste.
Lösung
# Tabelle erzeugen
studierende = pd.DataFrame({
'Name': ['Anna', 'Berkan', 'Clara', 'Daniel'],
'Fachsemester': [2, 4, 1, 3],
'Studiengang': ['Wima', 'VWL', 'Wima', 'BWL']
})
# Tabelle anzeigen
print(studierende)
Ähnlich wie bei Arrays können Sie auch auf Elemente einer Tabelle zugreifen, um diese auszulesen, zu verändern oder neue hinzuzufügen. Die Syntax unterscheidet sich dabei jedoch leicht.
Spalten können Sie mittels ihres Spaltennames adressieren, zum Beispiel \(\texttt{studierende['Name']} \rightarrow \texttt{['Anna', 'Berkan', 'Clara', 'Daniel']}\).
Zeilen werden mit ihrer Zeilennummer adressiert, zum Beispiel \( \texttt{studierende.loc[0]} \rightarrow \texttt{['Anna', 2, 'Wima']}. \)
Im Kapitel zum Auslesen von Tabellen werden wir ausführlicher behandeln, wie genau man Daten aus einem \(\texttt{DataFrame}\) extrahieren kann. Fürs Erste reicht aber die grundlegende Zugriffssyntax.
Wenn Sie eine neue Zeile zu einem bestehenden \(\texttt{DataFrame}\) hinzufügen möchten, können Sie dafür ebenfalls die \(\texttt{loc[]}\)-Methode verwenden. Dabei geben Sie den Index an, unter dem die neue Zeile eingefügt werden soll. Die Werte der neuen Zeile müssen in der gleichen Reihenfolge angegeben werden wie die Spalten im \(\texttt{DataFrame}\) names \(\texttt{data}\):
Typischerweise sollte der Index der neuen Zeile der Zeilennummer entsprechen, damit der Zugriff auf konkrete Zeilen einheitlich bleibt.
# Neue Zeile ganz unten hinzufügen
veranstaltungen.loc[len(veranstaltungen)] = ['Marketing', 'Vorlesung', 300]
print(veranstaltungen)
Aufgabe 1.2
Fügen Sie die VWL-Studierende Elif zum Datensatz \(\texttt{studierende}\) hinzu. Sie ist im 2. Fachsemster.
# Ihr Code
Hinweis
Nutzen Sie \(\texttt{.loc[neue_zeilennummer]}\) und übergeben Sie die relevanten Informationen in der richtigen Reihenfolge in einer Liste.
Lösung
# Neue Zeile einfügen
studierende.loc[len(studierende)] = ['Elif', 2, 'VWL']
print(studierende)
Wenn Sie eine neue Spalte zu einem bestehenden \(\texttt{DataFrame}\) hinzufügen möchten, können Sie einfach einen neuen Spaltennamen in eckigen Klammern angeben und ihm eine Liste von Werten zuweisen:
# Neue Spalte 'Gebäude' hinzufügen
veranstaltungen['Gebäude'] = ['B6', 'B6', 'A3', 'SO', 'A3']
print(veranstaltungen)
Aufgabe 1.3
Erweitern Sie \(\texttt{studierende}\) um eine neue Spalte namens Alter. Verwenden Sie dafür die folgenden Altersangaben:
Name |
Fachsemester |
Studiengang |
Alter |
|---|---|---|---|
Anna |
2 |
Wima |
20 |
Berkan |
4 |
VWL |
23 |
Clara |
1 |
Wima |
19 |
Daniel |
3 |
BWL |
22 |
Elif |
2 |
VWL |
21 |
# Ihr Code
Lösung
# Neue Spalte 'Alter' hinzufügen
studierende['Alter'] = [20, 23, 19, 22, 21]
print(studierende)
Existierende Tabellen zusammenfügen#
Manchmal sind Informationen auf mehrere Tabellen verteilt. Das Kombinieren von Tabellen funktioniert ähnlich wie bei Matrizen, solange die Dimensionen und Inhalte kompatibel sind.
Bei der vertikalen Verkettung werden Tabellen untereinandergehängt. In Pandas funktioniert das mit \(\texttt{pd.concat()}\). Dafür müssen:
Die Spalten denselben Namen haben.
Die Datentypen der Spalten kompatibel sein (z. B. dürfen keine Zahlen mit Text kombiniert werden).
# Neue Zeilen in einem zweiten DataFrame
neue_veranstaltungen = pd.DataFrame({
'Veranstaltung': ['Mikroökonomie', 'Numerik'],
'Typ': ['Vorlesung', 'Große Übung'],
'Raumgröße': [210, 150],
'Gebäude': ['SO','A5']
})
# Kombination durch vertikale Verkettung
alle_veranstaltungen = pd.concat([veranstaltungen, neue_veranstaltungen])
print(alle_veranstaltungen)
Standardmäßig behält Pandas die ursprünglichen Zeilenindizes bei, was zu doppelten oder nicht fortlaufenden Indizes in der zusammengeführten Tabelle führen kann. Um eine fortlaufende Nummerierung zu erhalten, muss man \(\texttt{ignore_index=True}\) setzen:
# Neue Zeilen in einem zweiten DataFrame
neue_veranstaltungen = pd.DataFrame({
'Veranstaltung': ['Mikroökonomie', 'Numerik'],
'Typ': ['Vorlesung', 'Große Übung'],
'Raumgröße': [210, 150],
'Gebäude': ['SO','A5']
})
# Kombination durch vertikale Verkettung
alle_veranstaltungen = pd.concat([veranstaltungen, neue_veranstaltungen], ignore_index=True)
print(alle_veranstaltungen)
Aufgabe 2.1
Erzeugen Sie einen Datensatz namens \(\texttt{alle_studierenden}\), der die Informationen aus \(\texttt{studierende}\) mit der folgenden Tabelle kombinert:
Name |
Fachsemester |
Studiengang |
Alter |
|---|---|---|---|
Fatma |
1 |
Wima |
18 |
Gustav |
5 |
VWL |
25 |
# Ihr Code
Hinweis
Reproduzieren Sie zunächst die Tabelle mit den zwei neuen Studierenden und utzen Sie anschließend \(\texttt{pd.concat()}\). Achten Sie darauf, dass die Spalten denselben Namen haben und die Datentypen kompatibel sind.
Lösung
neue_studierende = pd.DataFrame({
'Name': ['Fatma', 'Gustav'],
'Fachsemester': [1, 5],
'Studiengang': ['Wima', 'VWL'],
'Alter': [18, 25]
})
# Vertikal zusammenfügen (neue Zeilen)
alle_studierenden = pd.concat([studierende, neue_studierende], ignore_index=True)
print(alle_studierenden)
Bei der horizontalen Verkettung werden Tabellen nebeneinandergehängt. Auch das funktioniert mit \(\texttt{pd.concat()}\) jedoch mit der zusätzlichen Eingabe \(\texttt{axis=1}\), wenn:
Die Tabellen gleich viele Zeilen haben.
Jede Zeile zur gleichen Beobachtung gehört.
# Zusätzliche Informationen zu bestehenden Zeilen
ausstattung = pd.DataFrame({
'Technik': ['Beamer', 'Tafel', 'Tafel', 'Beamer', 'Beamer'],
'Fenster': [True, True, True, True, True]
})
# Kombination durch horizontale Verkettung
veranstaltungen_mit_technik = pd.concat([veranstaltungen, ausstattung], axis=1)
print(veranstaltungen_mit_technik)
Achtung
Die Zeilen müssen in der gleichen Reihenfolge stehen wie im Original. Sonst können falsche Informationen kombiniert werden.
Aufgabe 2.2
Erzeugen Sie einen Datensatz namens \(\texttt{studierende_mit_anfahrt}\), der die Informationen aus \(\texttt{studierende}\) mit der folgenden Tabelle kombiniert:
Name |
Wohnort |
Weg zur Uni |
|---|---|---|
Anna |
Frankfurt |
Zug |
Berkan |
Mannheim |
zu Fuß |
Daniel |
Stuttgart |
Auto |
Elif |
Mannheim |
Tram |
Clara |
Mannheim |
Bus |
# Ihr Code
Hinweis
Nutzen Sie \(\texttt{pd.concat()}\) und achten Sie darauf, dass gleich viele Zeilen vorhanden sind und die Zeilen der gleichen Beobachtung zugeordnet werden.
Lösung
# Neuer DataFrame mit Zusatzinfos
zusatzinfos = pd.DataFrame({
'Name': ['Anna', 'Berkan', 'Clara', 'Daniel', 'Elif'],
'Wohnort': ['Frankfurt', 'Mannheim', 'Mannheim', 'Stuttgart', 'Mannheim'],
'Weg zur Uni': ['Zug', 'zu Fuß', 'Bus', 'Auto', 'Tram']
})
# Horizontales Zusammenfügen (Spalten werden ergänzt)
studierende_mit_anfahrt = pd.concat([studierende, zusatzinfos], axis=1)
print(studierende_mit_anfahrt)