"Es können auch gezielt Daten aus Zellen extrahiert werden mit Angabe der Index- und Spaltennamen."
"Es können auch gezielt Daten aus Zellen extrahiert werden mit Angabe der Index- und Spaltennamen."
...
@@ -307,14 +307,14 @@
...
@@ -307,14 +307,14 @@
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count": null,
"execution_count": null,
"id": "461d1edc",
"id": "350cae87",
"metadata": {},
"metadata": {},
"outputs": [],
"outputs": [],
"source": []
"source": []
},
},
{
{
"cell_type": "markdown",
"cell_type": "markdown",
"id": "8c61bb24",
"id": "fe5a3611",
"metadata": {},
"metadata": {},
"source": [
"source": [
"## Zuweisung von neuen Spalten, Zeilen und Werten\n",
"## Zuweisung von neuen Spalten, Zeilen und Werten\n",
...
@@ -324,14 +324,14 @@
...
@@ -324,14 +324,14 @@
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count": null,
"execution_count": null,
"id": "98104be1",
"id": "2f1eaa39",
"metadata": {},
"metadata": {},
"outputs": [],
"outputs": [],
"source": []
"source": []
},
},
{
{
"cell_type": "markdown",
"cell_type": "markdown",
"id": "2b7233a6",
"id": "131b37ea",
"metadata": {},
"metadata": {},
"source": [
"source": [
"### Neue Zeile"
"### Neue Zeile"
...
@@ -340,14 +340,14 @@
...
@@ -340,14 +340,14 @@
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count": null,
"execution_count": null,
"id": "405e7c0f",
"id": "599d6c3b",
"metadata": {},
"metadata": {},
"outputs": [],
"outputs": [],
"source": []
"source": []
},
},
{
{
"cell_type": "markdown",
"cell_type": "markdown",
"id": "754f0b5d",
"id": "dea1aa70",
"metadata": {},
"metadata": {},
"source": [
"source": [
"### Neue Werte in Zelle"
"### Neue Werte in Zelle"
...
@@ -356,7 +356,7 @@
...
@@ -356,7 +356,7 @@
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count": null,
"execution_count": null,
"id": "e4a1bd03",
"id": "7071f172",
"metadata": {},
"metadata": {},
"outputs": [],
"outputs": [],
"source": []
"source": []
...
@@ -368,7 +368,7 @@
...
@@ -368,7 +368,7 @@
}
}
},
},
"cell_type": "markdown",
"cell_type": "markdown",
"id": "3d116064",
"id": "6c319518",
"metadata": {},
"metadata": {},
"source": [
"source": [
"## Gruppierungen\n",
"## Gruppierungen\n",
...
@@ -379,7 +379,7 @@
...
@@ -379,7 +379,7 @@
},
},
{
{
"cell_type": "markdown",
"cell_type": "markdown",
"id": "15351777",
"id": "92d1e6be",
"metadata": {},
"metadata": {},
"source": [
"source": [
"Gruppieren ohne Aggregatsfunktion gibt ein [DataFrame.groupby](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html#) zurück und keine DataFrame. Erst nach Aufruf der gewünschten Aggregatsfunktion bekommt man wieder eine DataFrame."
"Gruppieren ohne Aggregatsfunktion gibt ein [DataFrame.groupby](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html#) zurück und keine DataFrame. Erst nach Aufruf der gewünschten Aggregatsfunktion bekommt man wieder eine DataFrame."
...
@@ -388,14 +388,14 @@
...
@@ -388,14 +388,14 @@
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count": null,
"execution_count": null,
"id": "9e06a8d3",
"id": "1c106732",
"metadata": {},
"metadata": {},
"outputs": [],
"outputs": [],
"source": []
"source": []
},
},
{
{
"cell_type": "markdown",
"cell_type": "markdown",
"id": "448eaac0",
"id": "af7210de",
"metadata": {},
"metadata": {},
"source": [
"source": [
"## DataFrames filtern nach Bedingungen"
"## DataFrames filtern nach Bedingungen"
...
@@ -404,7 +404,7 @@
...
@@ -404,7 +404,7 @@
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count": null,
"execution_count": null,
"id": "0f14d0bc",
"id": "92438742",
"metadata": {},
"metadata": {},
"outputs": [],
"outputs": [],
"source": []
"source": []
...
@@ -416,7 +416,7 @@
...
@@ -416,7 +416,7 @@
}
}
},
},
"cell_type": "markdown",
"cell_type": "markdown",
"id": "c8e086c7",
"id": "256527fc",
"metadata": {},
"metadata": {},
"source": [
"source": [
"## DataFrames zusammenfügen (Merge)\n",
"## DataFrames zusammenfügen (Merge)\n",
...
@@ -427,14 +427,14 @@
...
@@ -427,14 +427,14 @@
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count": null,
"execution_count": null,
"id": "a2d50399",
"id": "182f57ef",
"metadata": {},
"metadata": {},
"outputs": [],
"outputs": [],
"source": []
"source": []
},
},
{
{
"cell_type": "markdown",
"cell_type": "markdown",
"id": "21137c01",
"id": "d6f9a0dd",
"metadata": {},
"metadata": {},
"source": [
"source": [
"## Plots"
"## Plots"
...
@@ -443,7 +443,7 @@
...
@@ -443,7 +443,7 @@
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count": null,
"execution_count": null,
"id": "23d198b9",
"id": "709288ea",
"metadata": {},
"metadata": {},
"outputs": [],
"outputs": [],
"source": []
"source": []
...
@@ -455,7 +455,7 @@
...
@@ -455,7 +455,7 @@
}
}
},
},
"cell_type": "markdown",
"cell_type": "markdown",
"id": "778c5013",
"id": "8b1d4e55",
"metadata": {},
"metadata": {},
"source": [
"source": [
"## Pivot\n",
"## Pivot\n",
...
@@ -466,15 +466,24 @@
...
@@ -466,15 +466,24 @@
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count": null,
"execution_count": null,
"id": "3a76bdb0",
"id": "0dbc5cee",
"metadata": {},
"metadata": {},
"outputs": [],
"outputs": [],
"source": []
"source": []
},
},
{
"cell_type": "markdown",
"id": "acc6f66c",
"metadata": {},
"source": [
"## Was tun, wenn die gewünschte Funktion nicht in *Pandas* vorhanden?\n",
"Mit der Nutzung von [`apply()`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html) lassen sich Funktionen auf ganze Serien oder DataFrames anwenden. Es können auch eigene Funktionen mit `lambda` angewendet werden."
]
},
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count": null,
"execution_count": null,
"id": "6b601c97",
"id": "c6c2876f",
"metadata": {},
"metadata": {},
"outputs": [],
"outputs": [],
"source": []
"source": []
...
...
%% Cell type:markdown id:3ff02aca tags:
%% Cell type:markdown id:532e7e1e tags:
# Daten einlesen und analysieren mit Pandas
# Daten einlesen und analysieren mit Pandas
In diesem Notebook geht es um das Einlesen und Analysieren von Daten mit der Python-Bibliothek [*Pandas*](https://pandas.pydata.org/docs/index.html).
In diesem Notebook geht es um das Einlesen und Analysieren von Daten mit der Python-Bibliothek [*Pandas*](https://pandas.pydata.org/docs/index.html).
%% Cell type:markdown id:9f62ac40 tags:
%% Cell type:markdown id:164b9c0d tags:
## Installation
## Installation
- Terminal: `pip install pandas` oder `conda install pandas`.
- Terminal: `pip install pandas` oder `conda install pandas`.
- Jupyter notebook: `!pip install pandas` oder `!conda install pandas`.
- Jupyter notebook: `!pip install pandas` oder `!conda install pandas`.
%% Cell type:markdown id:d82392ea tags:
%% Cell type:markdown id:00c1cced tags:
## Import Statement
## Import Statement
Wie bei anderen Python-Bibliotheken auch, müssen wir *Pandas* vor der Nutzung erst importieren. Es ist Konvention dabei *Pandas* als `pd` abzukürzen. In der Regel sind daher mit Funktionen die mit `pd.FUNKTIONSNAME()` aufgerufen werden, Funktionen aus *Pandas*.
Wie bei anderen Python-Bibliotheken auch, müssen wir *Pandas* vor der Nutzung erst importieren. Es ist Konvention dabei *Pandas* als `pd` abzukürzen. In der Regel sind daher mit Funktionen die mit `pd.FUNKTIONSNAME()` aufgerufen werden, Funktionen aus *Pandas*.
%% Cell type:code id:115c3765 tags:
%% Cell type:code id:f1048116 tags:
```
```
import pandas as pd
import pandas as pd
```
```
%% Cell type:markdown id:ad369b95 tags:
%% Cell type:markdown id:d2976c77 tags:
## DataFrames
## DataFrames
Die [DataFrame](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html) ist ein zweidimensionaler Datentyp in *Pandas* und dient zur Verarbeitung von tabellarischen Daten. Es ist Konvention Variablen die DataFarames referenzieren als `df` zu bezeichnen.
Die [DataFrame](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html) ist ein zweidimensionaler Datentyp in *Pandas* und dient zur Verarbeitung von tabellarischen Daten. Es ist Konvention Variablen die DataFarames referenzieren als `df` zu bezeichnen.
Hier gibt es verschiedene Möglichkeiten, allerdings ist kann ein Python-Dictionary direkt die Spaltennamen und Werte festgelegt werden. Jeder Schlüssel entspricht hierbei dem Spaltennamen und die jeweiligen Werte den Listen der Schlüssel.
Hier gibt es verschiedene Möglichkeiten, allerdings ist kann ein Python-Dictionary direkt die Spaltennamen und Werte festgelegt werden. Jeder Schlüssel entspricht hierbei dem Spaltennamen und die jeweiligen Werte den Listen der Schlüssel.
%% Cell type:code id:92c2067a tags:
%% Cell type:code id:bc1bb54d tags:
```
```
adict = {'a': 1, 'b': 2, 'c': 3}
adict = {'a': 1, 'b': 2, 'c': 3}
```
```
%% Cell type:code id:8fd3f91c tags:
%% Cell type:code id:94ff20fa tags:
```
```
pd.DataFrame(adict.values(), index=adict.keys())
pd.DataFrame(adict.values(), index=adict.keys())
```
```
%% Cell type:markdown id:3da8dfae tags:
%% Cell type:markdown id:87eae82c tags:
#### Einlesen einer Excel-Datei
#### Einlesen einer Excel-Datei
In der Praxis werden DataFrames meist durch das einlesen von Daten aus externen Formaten erzeugt, wie bspw. Excel oder CSV-Dateien.
In der Praxis werden DataFrames meist durch das einlesen von Daten aus externen Formaten erzeugt, wie bspw. Excel oder CSV-Dateien.
%% Cell type:code id:a3784fa3 tags:
%% Cell type:code id:21a56d1a tags:
```
```
df = pd.read_excel('example.xlsx')
df = pd.read_excel('example.xlsx')
```
```
%% Cell type:markdown id:5275f2d5 tags:
%% Cell type:markdown id:ea4ae721 tags:
### Einlesen einer CSV Datei
### Einlesen einer CSV Datei
In diesem Beispiel verwenden wir den [Books Datensatz](https://www.kaggle.com/datasets/jalota/books-dataset).
In diesem Beispiel verwenden wir den [Books Datensatz](https://www.kaggle.com/datasets/jalota/books-dataset).
<divclass="alert alert-info">
<divclass="alert alert-info">
<b>Achtung</b> Beim einlesen von CSV Dateien, ist es wichtig auf den Parameter <i>sep</i> zu achten. Dieser gibt vor, was als Trennungszeichen verwendet wird.
<b>Achtung</b> Beim einlesen von CSV Dateien, ist es wichtig auf den Parameter <i>sep</i> zu achten. Dieser gibt vor, was als Trennungszeichen verwendet wird.
</div>
</div>
%% Cell type:code id:6b7b4c76 tags:
%% Cell type:code id:b5735f8f tags:
```
```
df = pd.read_csv('books.csv')
df = pd.read_csv('books.csv')
```
```
%% Cell type:markdown id:3a9c7760 tags:
%% Cell type:markdown id:457ee3a5 tags:
## Einlesen von HTML
## Einlesen von HTML
%% Cell type:code id:26257be1 tags:
%% Cell type:code id:82e944d3 tags:
```
```
```
```
%% Cell type:markdown id:7323c72e tags:
%% Cell type:markdown id:9e87daca tags:
## Datenbereinigung
## Datenbereinigung
### Datentypen korrigieren
### Datentypen korrigieren
Oft sind beim Einlesen von Daten nicht alle Datentypen direkt entsprechend gesetzt in der DataFrame. Daher, muss dies manuell gemacht werden mit der Funktion [`astype()`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.astype.html).
Oft sind beim Einlesen von Daten nicht alle Datentypen direkt entsprechend gesetzt in der DataFrame. Daher, muss dies manuell gemacht werden mit der Funktion [`astype()`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.astype.html).
%% Cell type:code id:51571e56 tags:
%% Cell type:code id:d20e1881 tags:
```
```
```
```
%% Cell type:markdown id:82ba7b2a tags:
%% Cell type:markdown id:addda084 tags:
### Fehlende Werte ersetzen
### Fehlende Werte ersetzen
Fehlende Werte werden in *Pandas* mit `nan` bezeichnet. Daher sollten Werte die in den Rohdaten für fehlende Werte stehen (bspw. "unbekannt", "-", "n.a.") damit ersetzt werden.
Fehlende Werte werden in *Pandas* mit `nan` bezeichnet. Daher sollten Werte die in den Rohdaten für fehlende Werte stehen (bspw. "unbekannt", "-", "n.a.") damit ersetzt werden.
%% Cell type:code id:8accf74e tags:
%% Cell type:code id:34637e3b tags:
```
```
```
```
%% Cell type:markdown id:6a88e31f tags:
%% Cell type:markdown id:e77785ca tags:
## Nützliche Funktionen der DataFrame
## Nützliche Funktionen der DataFrame
### Oberste Spalten zeigen
### Oberste Spalten zeigen
%% Cell type:code id:6f0980aa tags:
%% Cell type:code id:b3b5f090 tags:
```
```
```
```
%% Cell type:markdown id:77fb244e tags:
%% Cell type:markdown id:7a4ac4a4 tags:
### Unterste Spalten anzeigen
### Unterste Spalten anzeigen
%% Cell type:code id:9aaed85c tags:
%% Cell type:code id:a2e39b7c tags:
```
```
```
```
%% Cell type:markdown id:818060c4 tags:
%% Cell type:markdown id:1b479d1f tags:
### Datentypen der Spalten der DataFrame
### Datentypen der Spalten der DataFrame
%% Cell type:code id:b702bdb3 tags:
%% Cell type:code id:0d3ff72a tags:
```
```
```
```
%% Cell type:markdown id:31f5e502 tags:
%% Cell type:markdown id:878d7811 tags:
### Descriptive Statistiken der DataFrame
### Descriptive Statistiken der DataFrame
%% Cell type:code id:0568d2a0 tags:
%% Cell type:code id:23647869 tags:
```
```
```
```
%% Cell type:markdown id:a20a3e39 tags:
%% Cell type:markdown id:a12eb0cb tags:
### Descriptive Statistiken pro Spalte
### Descriptive Statistiken pro Spalte
%% Cell type:code id:08339b12 tags:
%% Cell type:code id:80d5d597 tags:
```
```
```
```
%% Cell type:markdown id:af34f55c tags:
%% Cell type:markdown id:9c3caccf tags:
## Selektion von Daten aus DataFrames
## Selektion von Daten aus DataFrames
### Spalten extrahieren
### Spalten extrahieren
Wenn nur eine Spalte extrahiert wird, entspricht der Datentyp einer [Series](https://pandas.pydata.org/docs/reference/api/pandas.Series.html?highlight=series#pandas.Series). Diese hat teilweise andere Funktionen und nicht alle Funktionen, welche die DataFrame hat.
Wenn nur eine Spalte extrahiert wird, entspricht der Datentyp einer [Series](https://pandas.pydata.org/docs/reference/api/pandas.Series.html?highlight=series#pandas.Series). Diese hat teilweise andere Funktionen und nicht alle Funktionen, welche die DataFrame hat.
%% Cell type:code id:05ba9409 tags:
%% Cell type:code id:7bafdfc1 tags:
```
```
```
```
%% Cell type:markdown id:db70c055 tags:
%% Cell type:markdown id:97aad3de tags:
### Einzelne Zellen extrahieren
### Einzelne Zellen extrahieren
Eine Möglichkeit ist, dies mit dem Index der Dimension zu tun, bspw: "Gib mir die Daten der zweiten Spalte und der dritten Zeile". Dies funktioniert mit der Funktion `iloc`.
Eine Möglichkeit ist, dies mit dem Index der Dimension zu tun, bspw: "Gib mir die Daten der zweiten Spalte und der dritten Zeile". Dies funktioniert mit der Funktion `iloc`.
<div class="alert alert-info">
<div class="alert alert-info">
<b>Achtung!</b> Wie in Python üblich, started die Indizierung bei 0. Das heißt: die erste Zeile und Spalte wird jeweils mit 0 extrahiert und nicht mit 1. 1 extrahiert die zweite Spalte usw.
<b>Achtung!</b> Wie in Python üblich, started die Indizierung bei 0. Das heißt: die erste Zeile und Spalte wird jeweils mit 0 extrahiert und nicht mit 1. 1 extrahiert die zweite Spalte usw.
</div>
</div>
%% Cell type:code id:e82303e6 tags:
%% Cell type:code id:ade5a46f tags:
```
```
```
```
%% Cell type:markdown id:fae19c23 tags:
%% Cell type:markdown id:ab307fb7 tags:
Es können auch gezielt Daten aus Zellen extrahiert werden mit Angabe der Index- und Spaltennamen.
Es können auch gezielt Daten aus Zellen extrahiert werden mit Angabe der Index- und Spaltennamen.
%% Cell type:code id:461d1edc tags:
%% Cell type:code id:350cae87 tags:
```
```
```
```
%% Cell type:markdown id:8c61bb24 tags:
%% Cell type:markdown id:fe5a3611 tags:
## Zuweisung von neuen Spalten, Zeilen und Werten
## Zuweisung von neuen Spalten, Zeilen und Werten
### Neue Spalte
### Neue Spalte
%% Cell type:code id:98104be1 tags:
%% Cell type:code id:2f1eaa39 tags:
```
```
```
```
%% Cell type:markdown id:2b7233a6 tags:
%% Cell type:markdown id:131b37ea tags:
### Neue Zeile
### Neue Zeile
%% Cell type:code id:405e7c0f tags:
%% Cell type:code id:599d6c3b tags:
```
```
```
```
%% Cell type:markdown id:754f0b5d tags:
%% Cell type:markdown id:dea1aa70 tags:
### Neue Werte in Zelle
### Neue Werte in Zelle
%% Cell type:code id:e4a1bd03 tags:
%% Cell type:code id:7071f172 tags:
```
```
```
```
%% Cell type:markdown id:3d116064 tags:
%% Cell type:markdown id:6c319518 tags:
## Gruppierungen
## Gruppierungen
Die Gruppierungen in *Pandas* sind vergleichbar mit dem `GROUP BY` in SQL.
Die Gruppierungen in *Pandas* sind vergleichbar mit dem `GROUP BY` in SQL.
Gruppieren ohne Aggregatsfunktion gibt ein [DataFrame.groupby](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html#) zurück und keine DataFrame. Erst nach Aufruf der gewünschten Aggregatsfunktion bekommt man wieder eine DataFrame.
Gruppieren ohne Aggregatsfunktion gibt ein [DataFrame.groupby](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html#) zurück und keine DataFrame. Erst nach Aufruf der gewünschten Aggregatsfunktion bekommt man wieder eine DataFrame.
## Was tun, wenn die gewünschte Funktion nicht in *Pandas* vorhanden?
Mit der Nutzung von [`apply()`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html) lassen sich Funktionen auf ganze Serien oder DataFrames anwenden. Es können auch eigene Funktionen mit `lambda` angewendet werden.