Auslesen von Tabellen#

Nachdem wir eigene Datenstrukturen erstellt haben, arbeiten wir nun mit bereits existierenden Datensätzen. Dabei lernen Sie, wie man Daten lädt, gezielt Informationen extrahiert und vorhandene Tabellen effizient bearbeitet, um aussagekräftige Analysen zu ermöglichen.

Mit Pandas lassen sich Daten direkt aus dem Internet laden. Dazu verwendet man die Funktion \(\texttt{pd.read_csv()}\), die CSV-Dateien einlesen kann. Übergibt man dieser Funktion eine URL, lädt Panda die Datei direkt von dort und erstellt ein \(\texttt{DataFrame}.\) Die URL muss dabei in Anführungszeichen, sprich \(\texttt{' '}\) oder \(\texttt{" "}\), gesetzt werden.

Aufgabe 1.1

Laden Sie den Trinkgeld-Datensatz, welcher unter der URL ‘https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv’ verfügbar ist, als \(\texttt{DataFrame}\) unter dem Namen \(\texttt{Trinkgeld}\).

# Ihr Code 

Der geladene Datensatz enthält Informationen über Restaurantbesuche. Jede Zeile steht für einen Besuch und enthält unter anderem:

  • die Rechnungssumme unter dem Namen \(\texttt{total_bill}\)

  • das Trinkgeld, hier \(\texttt{tip}\)

  • das Geschlecht der Bedienung, hier \(\texttt{sex}\)

  • ob geraucht wurde, hier \(\texttt{smoker}\)

  • den Wochentag und die Uhrzeit

  • die Anzahl der Gäste

\(\texttt{DataFrame.head()}\) zeigt die ersten fünf Zeilen eines DataFrames an. Optional kann man in Klammern angeben, wie viele Zeilen man sehen möchte (z. B. \(\texttt{df.head(10)}\)). Vor dem Punkt muss der Name des \(\texttt{DataFrames}\) stehen, hier heißt der \(\texttt{DataFrame}\) als \(\texttt{df}\).

Aufgabe 1.2

Versuchen Sie ein Gefühl für den Datensatz zu bekommen, indem Sie sich die ersten sieben Zeilen ausgeben lassen.

# Ihr Code 

Daten extrahieren#

Spalten extrahieren#

In einem \(\texttt{DataFrame}\) können Sie gezielt einzelne Spalten oder mehrere Spalten gleichzeitig extrahieren. Spalten entsprechen dabei inhaltlich den Merkmalen, also den Variablen, die in einer Datentabelle erfasst wurden – zum Beispiel \(\texttt{total_bill},\) \(\texttt{tip}\) oder \(\texttt{sex}\).

Eine einzelne Spalte wählen Sie über ihren Spaltennamen in eckigen Klammern aus, zum Beispiel \(\texttt{Trinkgeld['tip']}\). Mehrere Spalten gleichzeitig ruft man mit einer Liste von Spaltennamen auf, zum Beispiel

\[\texttt{Trinkgeld[['tip','size']]}.\]

Aufgabe 1.3

Extrahieren Sie die Spalten \(\texttt{total_bill}\) und \(\texttt{tip}\) und speichern diese als neuen \(\texttt{DataFrame}\) namens \(\texttt{rechnung_und_trinkgeld}\) ab.

# Ihr Code 

Zeilen extrahieren#

Neben einzelnen Spalten können Sie auch gezielt einzelne Zeilen oder Gruppen von Zeilen extrahieren. Dazu nutzen Sie ihren Indexwert. Standardmäßig haben \(\texttt{DataFrames}\) einen numerischen Index, der bei 0 beginnt. Wenn Sie zum Beispiel die erste Zeile von \(\texttt{Trinkgeld}\) anzeigen möchten, schreiben Sie \(\texttt{Trinkgeld.loc[0]}\). Mehrere Zeilen lassen sich mit einer Liste von Indexwerten extrahieren, zum Beispiel

\[\texttt{Trinkgeld.loc[[0, 2, 4]]}\]

Auch ein ganzer Zeilenbereich kann mit einem Slice angegeben werden, zum Beispiel

\[\texttt{Trinkgeld.loc[0:4]}\]

Aufgabe 1.4

Extrahieren Sie die fünfte und sechste Zeile aus \(\texttt{Trinkgeld}\).

# Ihr Code 

Zeilen und Spalten simultan extrahieren#

Wenn Sie gleichzeitig Zeilen und Spalten extrahieren möchten, kombinieren Sie beide Auswahlkriterien in eckigen Klammern, zum Beispiel

\[\texttt{Trinkgeld.loc[0:2, ["total_bill", "tip"]]}.\]

Aufgabe 1.5

Extrahieren Sie die Zeilen 3 bis 11 und die Spalten \(\texttt{total_bill}\) und \(\texttt{size}\) des \(\texttt{DataFrames}\) namens \(\texttt{Trinkgeld}\).

# Ihr Code 

Nach Kriterien extrahieren#

Neben der Auswahl nach Position oder Name lassen sich auch gezielt Zeilen mit bestimmten Eigenschaften extrahieren. Dabei formulieren Sie Bedingungen innerhalb der eckigen Klammern \(\texttt{[]}\). Wenn Sie z. B. alle Zeilen anzeigen möchten, bei denen eine Frau bedient hat, schreiben Sie:

bedient_von_frau = Trinkgeld[Trinkgeld['sex'] == 'Female']
print(bedient_von_frau.head())

Bei solchen kategorischen Bedingungen (z. B. \(\texttt{== 'Female'}\)) gibt Pandas automatisch nur die passenden Zeilen zurück.

Genauso können Sie numerische Bedingungen formulieren, z. B. um alle Rechnungen über 30 Dollar zu extrahieren:

hohe_rechnungen = Trinkgeld[Trinkgeld['total_bill'] > 30]
print(hohe_rechnungen.head())

Sie können auch mehrere Bedingungen kombinieren, z. B. mit \(\texttt{&}\) (und) oder \(\texttt{|}\) (oder). Dabei muss jede Teilbedingung in Klammern stehen.

hohe_rechnungen_und_bedient_von_frau =  Trinkgeld[(Trinkgeld['total_bill'] > 30) & (Trinkgeld['sex'] == 'Female')]
print(hohe_rechnungen_und_bedient_von_frau.head())

Aufgabe 1.6

Filtern Sie alle Gäste, die in einem Raucherbereich saßen, und speichern die Daten als neuen \(\texttt{DataFrame}\) namens \(\texttt{raucher}\) ab.

# Ihr Code 

Aufgabe 1.7

Extrahieren Sie alle Zeilen, in denen entweder geraucht wurde oder das Trinkgeld über \(6 \$ \) lag. Speichern Sie diese in einem neuen \(\texttt{DataFrame}\) namens \(\texttt{rauch_oder_viel_trinkgeld}\).

# Ihr Code 

Daten bearbeiten#

In einem \(\texttt{DataFrame}\) mit dem Namen \(\texttt{df}\) können Sie ganz einfach Rechenoperationen mit den Werten einzelner Spalten durchführen, zum Beispiel

\[ \texttt{df['Differenz'] = df['Spalte1'] - df['Spalte2']}. \]

Dabei funktioniert jede Rechenoperation elementweise – das heißt, sie wird automatisch auf jeden Wert der Spalte angewendet.

Aufgabe 2.1

Der Wechselkurs von Dollar in Euro beträgt aktuell \(0.92\). Rechnen Sie den Rechnungsbetrag (\(\texttt{total_bill}\)) und das Trinkgeld (\(\texttt{tip}\)) in Euro um und speichern Sie das Ergebnis jeweils in einer neuen Spalte.

# Ihr Code 

Aufgabe 2.2

Berechnen Sie für jede Zeile das Verhältnis vom Trinkgeld zur Gesamtrechnug und speichern Sie das Ergebnis in einer neuen Spalte namens \(\texttt{tip_ratio}\).

# Ihr Code 

Aufgabe 2.3

Erstellen Sie eine neue Spalte namens \(\texttt{grosszuegig}\), die angibt, ob das Trinkgeld mehr als \(15 \% \) der Gesamtrechnung beträgt. In dieser Spalte soll für jede Zeile entweder \(\texttt{True}\) oder \(\texttt{False}\) stehen – je nachdem, ob die Bedingung erfüllt ist.

# Ihr Code 

In Pandas lassen sich numerische Spalten sehr einfach auswerten, ohne dass man selbst durch die Werte iterieren muss. Stattdessen stellt Pandas dafür eingebaute Funktionen zur Verfügung, wie etwa \(\texttt{.mean()}\) für den Mittelwert oder \(\texttt{.sum()}\) für die Summe.

Solche Funktionen können direkt auf numerische Spalten angewendet werden. Dadurch erhält man auf einfache Weise Kennzahlen wie Minimum, Maximum, Mittelwert oder Standardabweichung.

# Durchschnittliches Trinkgeld aller Gäste
durchschnitt = Trinkgeld['tip'].mean()
print(f"Durchschnittliches Trinkgeld: {durchschnitt:.2f} $")

Die folgende Tabelle zeigt Ihnen einige der wichtigsten Funktionen, mit denen Sie numerische Spalten schnell auswerten können.

Funktion

Beschreibung

Beispiel

\(\texttt{mean()}\)

Mittelwert

\(\texttt{DataFrame['Spalte'].mean()}\)

\(\texttt{median()}\)

Median (Zentralwert)

\(\texttt{DataFrame['Spalte'].median()}\)

\(\texttt{sum()}\)

Summe aller Werte

\(\texttt{DataFrame['Spalte'].sum()}\)

\(\texttt{min()}\)

Kleinster Wert

\(\texttt{DataFrame['Spalte'].min()}\)

\(\texttt{max()}\)

Größter Wert

\(\texttt{DataFrame['Spalte'].max()}\)

\(\texttt{std()}\)

Standardabweichung

\(\texttt{DataFrame['Spalte'].std()}\)

\(\texttt{var()}\)

Varianz

\(\texttt{DataFrame['Spalte'].var()}\)

\(\texttt{count()}\)

Anzahl gültiger Werte (ohne \(\texttt{NaN}\))

\(\texttt{DataFrame['Spalte'].count()}\)

Aufgabe 2.4

Vergleichen Sie das durchschnittliche Trinkgeld von Gästen, die von einer Frau bedient wurden, mit dem von Gästen, die von einem Mann bedient wurden. Wer gibt im Schnitt mehr?

# Ihr Code 

Aufgabe 2.5

Finden Sie heraus, wie hoch das größte gegebene Trinkgeld war. Ermitteln Sie außerdem, zu welchem Rechnungsbetrag und an welchem Wochentag es gegeben wurde.

# Ihr Code