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
Hinweis
Verwenden Sie \(\texttt{pd.read_csv()}\), um die Daten von der angegebenen URL zu laden. Stellen Sie sicher, dass die URL korrekt übergeben wird.
Lösung
import pandas as pd
url = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv'
Trinkgeld = pd.read_csv(url)
print(Trinkgeld)
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
Hinweis
Nutzen Sie \(\texttt{DataFrame.head()}\).
Lösung
Trinkgeld.head(7)
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
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
Hinweis
Mehrere Spalten wählt man mit einer Liste von Spaltennamen in doppelten eckigen Klammern aus: \(\texttt{Trinkgeld[[...]]}\).
Lösung
rechnung_und_trinkgeld = Trinkgeld[['total_bill', 'tip']]
rechnung_und_trinkgeld.head()
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
Auch ein ganzer Zeilenbereich kann mit einem Slice angegeben werden, zum Beispiel
Aufgabe 1.4
Extrahieren Sie die fünfte und sechste Zeile aus \(\texttt{Trinkgeld}\).
# Ihr Code
Hinweis
Nutzen Sie \(\texttt{Trinkgeld.loc[Index]}\). Denken Sie daran, dass die Indixierung in Python bei 0 startet.
Lösung
Trinkgeld.loc[4:5]
print(Trinkgeld.loc[4:5])
Zeilen und Spalten simultan extrahieren#
Wenn Sie gleichzeitig Zeilen und Spalten extrahieren möchten, kombinieren Sie beide Auswahlkriterien in eckigen Klammern, zum Beispiel
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
Hinweis
Nutzen Sie \(\texttt{.loc[start:end, [spaltenliste]]}\).
Lösung
Trinkgeld.loc[2:10, ['total_bill', 'size']]
print(Trinkgeld.loc[2:10, ['total_bill', 'size']])
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
Hinweis
Auch hier verwenden Sie eine Bedingung für die Spalte \(\texttt{smoker}\). Die Information ob die Gäste im Raucherbereich saßen ist mit \(\texttt{Yes}\) und \(\texttt{No}\) codiert.
Lösung
raucher = Trinkgeld[Trinkgeld['smoker'] == 'Yes']
print(raucher.head())
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
Hinweis
Verwenden Sie das logische Oder \(\texttt{|}\) und setzen Sie jede Bedingung in Klammern.
Lösung
rauch_oder_viel_trinkgeld = Trinkgeld[(Trinkgeld['smoker'] == 'Yes') | (Trinkgeld['tip'] > 6)]
print(rauch_oder_viel_trinkgeld.head())
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
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
Lösung
Trinkgeld['tip_euro'] = 0.92 * Trinkgeld['tip']
Trinkgeld['total_bill_euro'] = 0.92 * Trinkgeld['total_bill']
print(Trinkgeld[['total_bill', 'total_bill_euro', 'tip', 'tip_euro']].head())
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
Hinweis
Sie können zwei Spalten direkt miteinander verrechnen, zum Beispiel durch Division:
Lösung
# Alternativ können Sie auch mit den Wert in Euro rechnen
Trinkgeld['tip_ratio'] = Trinkgeld['tip'] / Trinkgeld['total_bill']
print(Trinkgeld[['total_bill', 'tip', 'tip_ratio']].head())
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
Hinweis
Logische Bedingungen zwischen Spalten können direkt formuliert werden:$\(\texttt{DataFrame['neue_spalte'] = DataFrame['spalte'] > 10}\)$
Lösung
Trinkgeld['grosszuegig'] = Trinkgeld['tip_ratio'] > 0.15
print(Trinkgeld[['total_bill', 'tip', 'tip_ratio', 'grosszuegig']].head())
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
Hinweis
Filtern Sie mit einer Bedingung auf die Spalte \(\texttt{sex}\), z. B. \(\texttt{Trinkgeld[Trinkgeld['sex'] == 'Female']}\), und wenden Sie \(\texttt{.mean()}\) auf die Spalte \(\texttt{tip}\) an.
Lösung
frau = Trinkgeld[Trinkgeld['sex'] == 'Female']['tip'].mean()
mann = Trinkgeld[Trinkgeld['sex'] == 'Male']['tip'].mean()
print("Durchschnitt Trinkgeld – Frau bedient:", frau)
print("Durchschnitt Trinkgeld – Mann bedient:", mann)
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
Hinweis
Nutzen Sie \(\texttt{.max()}\) auf die Spalte \(\texttt{tip}\), um den höchsten Wert zu finden. Verwenden Sie anschließend eine Filterbedingung, um die entsprechende Zeile anzuzeigen.
Lösung
max_tip = Trinkgeld['tip'].max()
spender = Trinkgeld[Trinkgeld['tip'] == max_tip]
print("Größtes Trinkgeld:", max_tip)
print(spender[['total_bill', 'day']])