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 

Ä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}\):

\[ \texttt{data.loc[neuer_index] = [wert_spalte1, wert_spalte2, ..., wert_spalteN]}. \]

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 

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:

\[ \texttt{veranstaltung["neue_spalte"] = [wert1, wert2, ..., wertN]}. \]
# 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 

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 

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