{ "cells": [ { "cell_type": "markdown", "id": "3bbada91", "metadata": {}, "source": [ "# Einführung in die Datenstrukturen von pandas\n", "\n", "Um mit pandas zu beginnen, solltet ihr euch zunächst mit den beiden wichtigsten Datenstrukturen vertraut machen: [Series](#Series) und [DataFrame](#DataFrame)." ] }, { "cell_type": "markdown", "id": "10a58a0a", "metadata": {}, "source": [ "## Series\n", "\n", "Eine Serie ist ein eindimensionales Array-ähnliches Objekt, das eine Folge von Werten (von ähnlichen Typen wie die NumPy-Typen) und ein zugehöriges Array von Datenbeschriftungen, genannt Index, enthält. Die einfachste Serie wird nur aus einem Array von Daten gebildet:" ] }, { "cell_type": "code", "execution_count": 1, "id": "9d2543d5", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "id": "bb36446b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 -0.734713\n", "1 0.003809\n", "2 0.291996\n", "3 0.024081\n", "4 1.115924\n", "5 0.551363\n", "6 1.029384\n", "dtype: float64" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series(np.random.randn(7))\n", "s" ] }, { "cell_type": "markdown", "id": "7798ea11", "metadata": {}, "source": [ "Die Zeichenkettendarstellung einer interaktiv angezeigten Reihe zeigt den Index auf der linken Seite und die Werte auf der rechten Seite. Da wir keinen Index für die Daten angegeben haben, wird ein Standardindex erstellt, der aus den ganzen Zahlen `0` bis `N - 1` besteht (wobei `N` die Anzahl (_Length_) der Daten ist). Ihr könnt die Array-Darstellung und das Index-Objekt der Reihe über ihre [pandas.Series.array](https://pandas.pydata.org/docs/reference/api/pandas.Series.array.html)- bzw. [pandas.Series.index](https://pandas.pydata.org/docs/reference/api/pandas.Series.index.html)-Attribute erhalten:" ] }, { "cell_type": "code", "execution_count": 3, "id": "5a0f8baf", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\n", "[ -0.7347134268241727, 0.0038087194642710165, 0.29199556053746856,\n", " 0.024081493463603963, 1.1159238685642536, 0.5513634668178448,\n", " 1.029384005342762]\n", "Length: 7, dtype: float64" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.array" ] }, { "cell_type": "code", "execution_count": 4, "id": "97c8043d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "RangeIndex(start=0, stop=7, step=1)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.index" ] }, { "cell_type": "markdown", "id": "51d17f06", "metadata": {}, "source": [ "Oft werdet ihr einen Index erstellen wollen, der jeden Datenpunkt mit einer Bezeichnung kennzeichnet:" ] }, { "cell_type": "code", "execution_count": 5, "id": "4702cdf3", "metadata": {}, "outputs": [], "source": [ "idx = pd.date_range(\"2022-01-31\", periods=7)\n", "\n", "s2 = pd.Series(np.random.randn(7), index=idx)" ] }, { "cell_type": "code", "execution_count": 6, "id": "7d1f4e98", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2022-01-31 -1.168981\n", "2022-02-01 0.127966\n", "2022-02-02 -1.915208\n", "2022-02-03 0.935589\n", "2022-02-04 -1.806423\n", "2022-02-05 1.076115\n", "2022-02-06 0.738466\n", "Freq: D, dtype: float64" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2" ] }, { "cell_type": "markdown", "id": "049f3276", "metadata": {}, "source": [ "
\n", "\n", "**Siehe auch**\n", "\n", "* [Time series / date functionality](https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html)\n", "
" ] }, { "cell_type": "markdown", "id": "9e54a203", "metadata": {}, "source": [ "Im Vergleich zu NumPy-Arrays könnt ihr Label im Index verwenden, wenn ihr einzelne Werte oder eine Gruppe von Werten auswählen wollt:" ] }, { "cell_type": "code", "execution_count": 7, "id": "03e38191", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1.9152075916006905" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2[\"2022-02-02\"]" ] }, { "cell_type": "code", "execution_count": 8, "id": "d54e94bb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2022-02-02 -1.915208\n", "2022-02-03 0.935589\n", "2022-02-04 -1.806423\n", "dtype: float64" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2[[\"2022-02-02\", \"2022-02-03\", \"2022-02-04\"]]" ] }, { "cell_type": "markdown", "id": "c84855f3", "metadata": {}, "source": [ "Hier wird `['2022-02-02', '2022-02-03', '2022-02-04']` als eine Liste von Indizes interpretiert, auch wenn sie Strings anstelle von ganzen Zahlen enthält." ] }, { "cell_type": "markdown", "id": "7ea7f450", "metadata": {}, "source": [ "Bei der Verwendung von NumPy-Funktionen oder NumPy-ähnlichen Operationen, wie z. B. dem Filtern mit einem booleschen Array, der skalaren Multiplikation oder der Anwendung mathematischer Funktionen, bleibt die Verknüpfung zwischen Index und Wert erhalten:" ] }, { "cell_type": "code", "execution_count": 9, "id": "3e28ec7f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2022-02-01 0.127966\n", "2022-02-03 0.935589\n", "2022-02-05 1.076115\n", "2022-02-06 0.738466\n", "dtype: float64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2[s2 > 0]" ] }, { "cell_type": "code", "execution_count": 10, "id": "7ece1234", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2022-01-31 1.366515\n", "2022-02-01 0.016375\n", "2022-02-02 3.668020\n", "2022-02-03 0.875327\n", "2022-02-04 3.263166\n", "2022-02-05 1.158024\n", "2022-02-06 0.545331\n", "Freq: D, dtype: float64" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2**2" ] }, { "cell_type": "code", "execution_count": 11, "id": "26432d85", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2022-01-31 0.310684\n", "2022-02-01 1.136514\n", "2022-02-02 0.147311\n", "2022-02-03 2.548715\n", "2022-02-04 0.164241\n", "2022-02-05 2.933262\n", "2022-02-06 2.092722\n", "Freq: D, dtype: float64" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.exp(s2)" ] }, { "cell_type": "markdown", "id": "2816c94c", "metadata": {}, "source": [ "Ihr könnt euch eine Serie auch als ein _ordered dict_ mit fester Länge vorstellen, da sie eine Zuordnung von Indexwerten zu Datenwerten darstellt. Sie kann in vielen Kontexten verwendet werden, in denen man ein _dict_ verwenden könnte:" ] }, { "cell_type": "code", "execution_count": 12, "id": "a6b15c25", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"2022-02-02\" in s2" ] }, { "cell_type": "code", "execution_count": 13, "id": "15f5ac04", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"2022-02-09\" in s2" ] }, { "cell_type": "markdown", "id": "3c3f6583", "metadata": {}, "source": [ "### Fehlende Daten\n", "\n", "`NA` und `null` werde ich synonym verwenden, um auf fehlende Daten hinzuweisen. Die Funktionen `isna` und `notna` in pandas sollten verwendet werden, um fehlende Daten zu erkennen:" ] }, { "cell_type": "code", "execution_count": 14, "id": "441dfafc", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2022-01-31 False\n", "2022-02-01 False\n", "2022-02-02 False\n", "2022-02-03 False\n", "2022-02-04 False\n", "2022-02-05 False\n", "2022-02-06 False\n", "Freq: D, dtype: bool" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.isna(s2)" ] }, { "cell_type": "code", "execution_count": 15, "id": "b7783e82", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2022-01-31 True\n", "2022-02-01 True\n", "2022-02-02 True\n", "2022-02-03 True\n", "2022-02-04 True\n", "2022-02-05 True\n", "2022-02-06 True\n", "Freq: D, dtype: bool" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.notna(s2)" ] }, { "cell_type": "markdown", "id": "8701962e", "metadata": {}, "source": [ "Series hat diese auch als Instanzmethoden:" ] }, { "cell_type": "code", "execution_count": 16, "id": "ace6b1b1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2022-01-31 False\n", "2022-02-01 False\n", "2022-02-02 False\n", "2022-02-03 False\n", "2022-02-04 False\n", "2022-02-05 False\n", "2022-02-06 False\n", "Freq: D, dtype: bool" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2.isna()" ] }, { "cell_type": "markdown", "id": "0d3d4c88", "metadata": {}, "source": [ "Der Umgang mit fehlenden Daten wird im Abschnitt [Verwalten fehlender Daten mit pandas](../../clean-prep/nulls.ipynb) ausführlicher behandelt." ] }, { "cell_type": "markdown", "id": "65c2256e", "metadata": {}, "source": [ "Eine für viele Anwendungen nützliche Funktion von Series ist die automatische Ausrichtung nach Indexbezeichnungen bei arithmetischen Operationen:" ] }, { "cell_type": "code", "execution_count": 17, "id": "435be489", "metadata": {}, "outputs": [], "source": [ "idx = pd.date_range(\"2022-02-07\", periods=7)\n", "\n", "s3 = pd.Series(np.random.randn(7), index=idx)" ] }, { "cell_type": "code", "execution_count": 18, "id": "ce5c4baa", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2022-01-31 -1.168981\n", " 2022-02-01 0.127966\n", " 2022-02-02 -1.915208\n", " 2022-02-03 0.935589\n", " 2022-02-04 -1.806423\n", " 2022-02-05 1.076115\n", " 2022-02-06 0.738466\n", " Freq: D, dtype: float64,\n", " 2022-02-07 -0.871571\n", " 2022-02-08 -0.599261\n", " 2022-02-09 0.803387\n", " 2022-02-10 0.448825\n", " 2022-02-11 -0.548544\n", " 2022-02-12 0.996237\n", " 2022-02-13 -0.414533\n", " Freq: D, dtype: float64)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2, s3" ] }, { "cell_type": "code", "execution_count": 19, "id": "6da01c13", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2022-01-31 NaN\n", "2022-02-01 NaN\n", "2022-02-02 NaN\n", "2022-02-03 NaN\n", "2022-02-04 NaN\n", "2022-02-05 NaN\n", "2022-02-06 NaN\n", "2022-02-07 NaN\n", "2022-02-08 NaN\n", "2022-02-09 NaN\n", "2022-02-10 NaN\n", "2022-02-11 NaN\n", "2022-02-12 NaN\n", "2022-02-13 NaN\n", "Freq: D, dtype: float64" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2 + s3" ] }, { "cell_type": "markdown", "id": "9cdee059", "metadata": {}, "source": [ "Wenn ihr Erfahrung mit SQL habt, ähnelt dies einem [JOIN](https://de.wikipedia.org/wiki/Join_(SQL))-Vorgang." ] }, { "cell_type": "markdown", "id": "f0e98fbc", "metadata": {}, "source": [ "Sowohl das Series-Objekt selbst als auch sein Index haben ein `name`-Attribut, das sich in andere Bereiche der pandas-Funktionalität integrieren lässt:" ] }, { "cell_type": "code", "execution_count": 20, "id": "7f230d0e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "date\n", "2022-02-07 -0.871571\n", "2022-02-08 -0.599261\n", "2022-02-09 0.803387\n", "2022-02-10 0.448825\n", "2022-02-11 -0.548544\n", "2022-02-12 0.996237\n", "2022-02-13 -0.414533\n", "Freq: D, Name: floats, dtype: float64" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s3.name = \"floats\"\n", "s3.index.name = \"date\"\n", "\n", "s3" ] }, { "cell_type": "markdown", "id": "fd5dd363", "metadata": {}, "source": [ "## DataFrame\n", "\n", "Ein DataFrame stellt eine rechteckige Datentabelle dar und enthält eine geordnete, benannte Sammlung von Spalten, von denen jede einen anderen Werttyp haben kann. Der DataFrame hat sowohl einen Zeilen- als auch einen Spaltenindex.\n", "\n", "
\n", "\n", "**Bemerkung**\n", "\n", "Ein DataFrame ist zwar zweidimensional, ihr könnt ihn aber auch verwenden, um mit [join](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.join.html), [combine](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.combine.html) und [Reshaping](https://pandas.pydata.org/pandas-docs/stable/user_guide/reshaping.html) höherdimensionale Daten in einem Tabellenformat mit hierarchischer Indizierung darzustellen.\n", "
" ] }, { "cell_type": "code", "execution_count": 21, "id": "4dcceaf8", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CodeDecimalOctalKey
0U+00000001NUL
1U+00011002Ctrl-A
2U+00022003Ctrl-B
3U+00033004Ctrl-C
4U+00044004Ctrl-D
5U+00055005Ctrl-E
\n", "
" ], "text/plain": [ " Code Decimal Octal Key\n", "0 U+0000 0 001 NUL\n", "1 U+0001 1 002 Ctrl-A\n", "2 U+0002 2 003 Ctrl-B\n", "3 U+0003 3 004 Ctrl-C\n", "4 U+0004 4 004 Ctrl-D\n", "5 U+0005 5 005 Ctrl-E" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = {\n", " \"Code\": [\"U+0000\", \"U+0001\", \"U+0002\", \"U+0003\", \"U+0004\", \"U+0005\"],\n", " \"Decimal\": [0, 1, 2, 3, 4, 5],\n", " \"Octal\": [\"001\", \"002\", \"003\", \"004\", \"004\", \"005\"],\n", " \"Key\": [\"NUL\", \"Ctrl-A\", \"Ctrl-B\", \"Ctrl-C\", \"Ctrl-D\", \"Ctrl-E\"],\n", "}\n", "df = pd.DataFrame(data)\n", "\n", "df" ] }, { "cell_type": "markdown", "id": "f4c0f9b7", "metadata": {}, "source": [ "Bei großen DataFrames wählt die `head`-Methode nur die ersten fünf Zeilen aus:" ] }, { "cell_type": "code", "execution_count": 22, "id": "a6bd6847", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CodeDecimalOctalKey
0U+00000001NUL
1U+00011002Ctrl-A
2U+00022003Ctrl-B
3U+00033004Ctrl-C
4U+00044004Ctrl-D
\n", "
" ], "text/plain": [ " Code Decimal Octal Key\n", "0 U+0000 0 001 NUL\n", "1 U+0001 1 002 Ctrl-A\n", "2 U+0002 2 003 Ctrl-B\n", "3 U+0003 3 004 Ctrl-C\n", "4 U+0004 4 004 Ctrl-D" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "id": "3119df2e", "metadata": {}, "source": [ "Ihr könnt auch die Reihenfolge der Spalten angeben:" ] }, { "cell_type": "code", "execution_count": 23, "id": "255c2df1", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CodeKey
0U+0000NUL
1U+0001Ctrl-A
2U+0002Ctrl-B
3U+0003Ctrl-C
4U+0004Ctrl-D
5U+0005Ctrl-E
\n", "
" ], "text/plain": [ " Code Key\n", "0 U+0000 NUL\n", "1 U+0001 Ctrl-A\n", "2 U+0002 Ctrl-B\n", "3 U+0003 Ctrl-C\n", "4 U+0004 Ctrl-D\n", "5 U+0005 Ctrl-E" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(data, columns=[\"Code\", \"Key\"])" ] }, { "cell_type": "markdown", "id": "10263131", "metadata": {}, "source": [ "Wenn ihr eine Spalte übergeben wollt, die nicht im Dict enthalten ist, wird sie ohne Werte im Ergebnis erscheinen:" ] }, { "cell_type": "code", "execution_count": 24, "id": "b9e1f9de", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CodeDecimalOctalDescriptionKey
0U+00000001NaNNUL
1U+00011002NaNCtrl-A
2U+00022003NaNCtrl-B
3U+00033004NaNCtrl-C
4U+00044004NaNCtrl-D
5U+00055005NaNCtrl-E
\n", "
" ], "text/plain": [ " Code Decimal Octal Description Key\n", "0 U+0000 0 001 NaN NUL\n", "1 U+0001 1 002 NaN Ctrl-A\n", "2 U+0002 2 003 NaN Ctrl-B\n", "3 U+0003 3 004 NaN Ctrl-C\n", "4 U+0004 4 004 NaN Ctrl-D\n", "5 U+0005 5 005 NaN Ctrl-E" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2 = pd.DataFrame(\n", " data, columns=[\"Code\", \"Decimal\", \"Octal\", \"Description\", \"Key\"]\n", ")\n", "\n", "df2" ] }, { "cell_type": "markdown", "id": "1b9d1fa6", "metadata": {}, "source": [ "Ihr könnt eine Spalte in einem DataFrame mit einer Dict-ähnlichen Notation abrufen:" ] }, { "cell_type": "code", "execution_count": 25, "id": "710d340d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 U+0000\n", "1 U+0001\n", "2 U+0002\n", "3 U+0003\n", "4 U+0004\n", "5 U+0005\n", "Name: Code, dtype: object" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"Code\"]" ] }, { "cell_type": "markdown", "id": "d83e37b6", "metadata": {}, "source": [ "So könnt ihr auch eine Spalte zum Index machen:" ] }, { "cell_type": "code", "execution_count": 26, "id": "93789ae7", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DecimalOctalDescriptionKey
Code
U+00000001NaNNUL
U+00011002NaNCtrl-A
U+00022003NaNCtrl-B
U+00033004NaNCtrl-C
U+00044004NaNCtrl-D
U+00055005NaNCtrl-E
\n", "
" ], "text/plain": [ " Decimal Octal Description Key\n", "Code \n", "U+0000 0 001 NaN NUL\n", "U+0001 1 002 NaN Ctrl-A\n", "U+0002 2 003 NaN Ctrl-B\n", "U+0003 3 004 NaN Ctrl-C\n", "U+0004 4 004 NaN Ctrl-D\n", "U+0005 5 005 NaN Ctrl-E" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2 = pd.DataFrame(\n", " data, columns=[\"Decimal\", \"Octal\", \"Description\", \"Key\"], index=df[\"Code\"]\n", ")\n", "\n", "df2" ] }, { "cell_type": "markdown", "id": "325f0d83", "metadata": {}, "source": [ "Zeilen können nach Position oder Name mit dem [pandas.DataFrame.loc](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html)-Attribut abgerufen werden:" ] }, { "cell_type": "code", "execution_count": 27, "id": "3553b283", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "Decimal 1\n", "Octal 002\n", "Description NaN\n", "Key Ctrl-A\n", "Name: U+0001, dtype: object" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.loc[\"U+0001\"]" ] }, { "cell_type": "markdown", "id": "786400c7", "metadata": {}, "source": [ "Spaltenwerte können durch Zuweisung geändert werden. Zum Beispiel könnte der leeren Spalte _Description_ ein Einzelwert oder ein Array von Werten zugewiesen werden:" ] }, { "cell_type": "code", "execution_count": 28, "id": "1401e20e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DecimalOctalDescriptionKey
Code
U+00000001Null characterNUL
U+00011002Start of HeadingCtrl-A
U+00022003Start of TextCtrl-B
U+00033004End-of-text characterCtrl-C
U+00044004End-of-transmission characterCtrl-D
U+00055005Enquiry characterCtrl-E
\n", "
" ], "text/plain": [ " Decimal Octal Description Key\n", "Code \n", "U+0000 0 001 Null character NUL\n", "U+0001 1 002 Start of Heading Ctrl-A\n", "U+0002 2 003 Start of Text Ctrl-B\n", "U+0003 3 004 End-of-text character Ctrl-C\n", "U+0004 4 004 End-of-transmission character Ctrl-D\n", "U+0005 5 005 Enquiry character Ctrl-E" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2[\"Description\"] = [\n", " \"Null character\",\n", " \"Start of Heading\",\n", " \"Start of Text\",\n", " \"End-of-text character\",\n", " \"End-of-transmission character\",\n", " \"Enquiry character\",\n", "]\n", "\n", "df2" ] }, { "cell_type": "markdown", "id": "9bdb8ba8", "metadata": {}, "source": [ "Das Zuweisen einer nicht existierenden Spalte erzeugt eine neue Spalte." ] }, { "cell_type": "markdown", "id": "cc0e970a", "metadata": {}, "source": [ "Mit [pandas.DataFrame.drop](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop.html) können Spalten entfernt und mit `pandas.DataFrame.columns` angezeigt werden:" ] }, { "cell_type": "code", "execution_count": 29, "id": "aad52a20", "metadata": {}, "outputs": [], "source": [ "df3 = df2.drop(columns=[\"Decimal\", \"Octal\"])" ] }, { "cell_type": "code", "execution_count": 30, "id": "c591a573", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['Decimal', 'Octal', 'Description', 'Key'], dtype='object')" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.columns" ] }, { "cell_type": "code", "execution_count": 31, "id": "68d329b2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['Description', 'Key'], dtype='object')" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3.columns" ] }, { "cell_type": "markdown", "id": "158525ff", "metadata": {}, "source": [ "Eine weitere gängige Form von Daten sind verschachtelte Dict von Dicts:" ] }, { "cell_type": "code", "execution_count": 32, "id": "a060258c", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
U+0006U+0007
Decimal67
Octal006007
DescriptionAcknowledge characterBell character
KeyCtrl-FCtrl-G
\n", "
" ], "text/plain": [ " U+0006 U+0007\n", "Decimal 6 7\n", "Octal 006 007\n", "Description Acknowledge character Bell character\n", "Key Ctrl-F Ctrl-G" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u = {\n", " \"U+0006\": {\n", " \"Decimal\": \"6\",\n", " \"Octal\": \"006\",\n", " \"Description\": \"Acknowledge character\",\n", " \"Key\": \"Ctrl-F\",\n", " },\n", " \"U+0007\": {\n", " \"Decimal\": \"7\",\n", " \"Octal\": \"007\",\n", " \"Description\": \"Bell character\",\n", " \"Key\": \"Ctrl-G\",\n", " },\n", "}\n", "\n", "df4 = pd.DataFrame(u)\n", "\n", "df4" ] }, { "cell_type": "markdown", "id": "8ece4af0", "metadata": {}, "source": [ "Ihr könnt den DataFrame transponieren, d.h. die Zeilen und Spalten vertauschen, mit einer ähnlichen Syntax wie bei einem NumPy-Array:" ] }, { "cell_type": "code", "execution_count": 33, "id": "3a3e3c7c", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DecimalOctalDescriptionKey
U+00066006Acknowledge characterCtrl-F
U+00077007Bell characterCtrl-G
\n", "
" ], "text/plain": [ " Decimal Octal Description Key\n", "U+0006 6 006 Acknowledge character Ctrl-F\n", "U+0007 7 007 Bell character Ctrl-G" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4.T" ] }, { "cell_type": "markdown", "id": "4d7f54f2", "metadata": {}, "source": [ "
\n", "\n", "**Warnung**\n", "\n", "Beachtet, dass beim Transponieren die Datentypen der Spalten verworfen werden, wenn die Spalten nicht alle denselben Datentyp haben, so dass beim Transponieren und anschließenden Zurücktransponieren die vorherigen Typinformationen verloren gehen können. Die Spalten werden in diesem Fall zu Arrays aus reinen Python-Objekten.\n", "
" ] }, { "cell_type": "markdown", "id": "b30fb2c8", "metadata": {}, "source": [ "Die Schlüssel in den inneren Dicts werden kombiniert, um den Index im Ergebnis zu bilden. Dies ist nicht der Fall, wenn ein expliziter Index angegeben wird:" ] }, { "cell_type": "code", "execution_count": 34, "id": "d9161114", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
U+0006U+0007
Decimal67
Octal006007
KeyCtrl-FCtrl-G
\n", "
" ], "text/plain": [ " U+0006 U+0007\n", "Decimal 6 7\n", "Octal 006 007\n", "Key Ctrl-F Ctrl-G" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df5 = pd.DataFrame(u, index=[\"Decimal\", \"Octal\", \"Key\"])\n", "df5" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.11 Kernel", "language": "python", "name": "python311" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.4" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": {}, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }