From 7f4b02bb82f8c7b651d5bf0760ff134081eef204 Mon Sep 17 00:00:00 2001 From: cmalzer <claudia.malzer@geo.uni-goettingen.de> Date: Thu, 5 Sep 2019 12:18:48 +0200 Subject: [PATCH] update --- ...O_Aerzte_CSV.csv => HNO_Aerzte_Auszug.csv} | 0 Tutorials/Erste Schritte - Hello World.ipynb | 41 ++--- ...en 1 - if-Anweisungen und Vergleiche.ipynb | 64 +++++-- ... 2 - Schleifen, Listen, Dictionaries.ipynb | 47 ++--- Tutorials/Grundlagen 3 - Funktionen.ipynb | 22 +-- .../Grundlagen 4 - Pandas DataFrames.ipynb | 165 ++++++++++-------- 6 files changed, 196 insertions(+), 143 deletions(-) rename Daten/{HNO_Aerzte_CSV.csv => HNO_Aerzte_Auszug.csv} (100%) diff --git a/Daten/HNO_Aerzte_CSV.csv b/Daten/HNO_Aerzte_Auszug.csv similarity index 100% rename from Daten/HNO_Aerzte_CSV.csv rename to Daten/HNO_Aerzte_Auszug.csv diff --git a/Tutorials/Erste Schritte - Hello World.ipynb b/Tutorials/Erste Schritte - Hello World.ipynb index b788ae4..3ce63cf 100644 --- a/Tutorials/Erste Schritte - Hello World.ipynb +++ b/Tutorials/Erste Schritte - Hello World.ipynb @@ -13,7 +13,7 @@ "source": [ "Python ist eine Programmiersprache mit insgesamt recht intuitiver Syntax. Deshalb eignet sie sich gut für Einsteiger. Zum Programmieren kann man entweder den mit einer Python-Installation bereits beigefügten Editor <b>Idle</b> verwenden, oder eine mächtigere Entwicklungsumgebung (IDE) wie <b>Spyder</b>, welche man als Teil der Python-Umgebung <b>Anaconda</b> installieren kann.\n", "\n", - "In unserem Fall werden wir Python jedoch direkt hier in Jupyter ausführen. Jede sogenannte \"Zelle\" mit Code kann durch Drücken der Tasten <b>Shift+Enter</b> ausgeführt werden, oder alternativ durch den <i>Run</i>-Button in der Leiste oben. Das Menü \"Cell\" bietet zudem verschiedene Optionen, wie alle Zellen nacheineinander laufen zu lassen. Das Ergebnis der Ausführung (sofern eines zurückgeliefert wird) wird unter die entsprechende Zelle geschrieben." + "In unserem Fall werden wir Python jedoch direkt hier in Jupyter ausführen. Jede sogenannte \"Zelle\" mit Code kann durch Anklicken und anschließendes Drücken der Tasten <b>Shift+Enter</b> ausgeführt werden, oder alternativ durch den \"Run\"-Button in der Leiste oben. Das Menü \"Cell\" bietet zudem verschiedene Optionen, wie alle Zellen nacheineinander laufen zu lassen. Das Ergebnis der Ausführung (sofern eines zurückgeliefert wird) wird unter die entsprechende Zelle geschrieben." ] }, { @@ -25,7 +25,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -50,35 +50,20 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "5\n" - ] - } - ], - "source": [ - "print(5)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "5\n", "5.5\n" ] } ], "source": [ + "print(5)\n", "print(5.5)" ] }, @@ -91,7 +76,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -109,8 +94,8 @@ "print(begruessung)\n", "ganzzahl = 5\n", "print(ganzzahl)\n", - "dezimalzahl = 5.5\n", - "print(dezimalzahl)" + "fließkommazahl = 5.5\n", + "print(fließkommazahl)" ] }, { @@ -122,7 +107,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -138,7 +123,7 @@ "source": [ "print(type(begruessung))\n", "print(type(ganzzahl))\n", - "print(type(dezimalzahl))" + "print(type(fließkommazahl))" ] }, { @@ -150,7 +135,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -176,7 +161,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -200,7 +185,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 20, "metadata": {}, "outputs": [ { diff --git a/Tutorials/Grundlagen 1 - if-Anweisungen und Vergleiche.ipynb b/Tutorials/Grundlagen 1 - if-Anweisungen und Vergleiche.ipynb index dfbfe1e..b0c636d 100644 --- a/Tutorials/Grundlagen 1 - if-Anweisungen und Vergleiche.ipynb +++ b/Tutorials/Grundlagen 1 - if-Anweisungen und Vergleiche.ipynb @@ -16,12 +16,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5 ist größer als 1!\n" + ] + } + ], "source": [ "zahl = 5\n", - "if zahl > 1: #beachte die Syntax mit Schlüsselwort \"if\" und Doppelpunkt\n", + "if zahl > 1: #beachten Sie die Syntax mit Schlüsselwort \"if\" und Doppelpunkt\n", " print(str(5) + \" ist größer als 1!\")" ] }, @@ -35,7 +43,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -63,7 +71,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -95,22 +103,37 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Alles OK!\n" + ] + } + ], "source": [ "if \"Apfel\" == \"Birne\":\n", " print(\"Hier läuft was schief...\")\n", "else:\n", - " print(\"Alles OK!\")\n", - " " + " print(\"Alles OK!\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Der Computer findet das logisch, aber der Mensch sollte die Namen seiner Variablen überdenken.\n" + ] + } + ], "source": [ "apfel = \"Apfel\"\n", "birne = \"Apfel\"\n", @@ -127,15 +150,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Alles richtig!\n" + ] + } + ], "source": [ "apfel = \"Apfel\"\n", "birne = \"Birne\"\n", "if apfel != birne:\n", " print(\"Alles richtig!\")" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<b>Tipp: Sie haben nun das benötigte Wissen, um Übung 1 im Übungsordner zu bearbeiten.</b>" + ] } ], "metadata": { diff --git a/Tutorials/Grundlagen 2 - Schleifen, Listen, Dictionaries.ipynb b/Tutorials/Grundlagen 2 - Schleifen, Listen, Dictionaries.ipynb index d53bb29..12652f0 100644 --- a/Tutorials/Grundlagen 2 - Schleifen, Listen, Dictionaries.ipynb +++ b/Tutorials/Grundlagen 2 - Schleifen, Listen, Dictionaries.ipynb @@ -17,7 +17,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -41,19 +41,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Was bedeutet das i? Ganz einfach: i ist eine Variable, die in jedem Durchlauf einen anderen Wert annimmt. In diesem Fall wird von 0 bis 5 gezählt, wobei 5 nicht mit eingeschlossen ist." + "Was bedeutet das i? Ganz einfach: i ist eine Variable (die auch anders heißen könnte) und nimmt in jedem Durchlauf einen anderen Wert an. In diesem Fall werden die Werte von 0 bis 5 ausgegeben, wobei 5 nicht mit eingeschlossen ist." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Häufig benötigt man for-Schleifen, um Listen zu durchlaufen (<i>iterieren</i>). Z.B. eine Liste mit Strings oder eine Liste mit Zahlen oder auch gemischte Listen." + "Häufig benötigt man for-Schleifen, um <b>Listen</b> zu durchlaufen (<i>iterieren</i>). Z.B. eine Liste mit Strings oder eine Liste mit Zahlen oder auch gemischte Listen." ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -68,7 +68,7 @@ } ], "source": [ - "obst = [\"Apfel\", \"Banane\", \"Birne\", \"Weintraube\"] #Eine Liste. Beachte die eckigen Klammern!\n", + "obst = [\"Apfel\", \"Banane\", \"Birne\", \"Weintraube\"] #Eine Liste. Beachten Sie die eckigen Klammern!\n", "for x in obst:\n", " print(x)" ] @@ -82,7 +82,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -108,12 +108,12 @@ "source": [ "Allerdings ist die Version oben deutlich bequemer zu schreiben.\n", "\n", - "Wie an diesem Beispiel auch zu erkennen ist, greift man auf eine Element an einer bestimmmten Stelle in der Liste mithilfe eckiger Klammern und dem entsprechenden Index zu:" + "Wie an diesem Beispiel auch zu erkennen ist, greift man auf ein Element an einer bestimmmten Stelle in der Liste mithilfe eckiger Klammern und dem entsprechenden Index zu:" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -138,7 +138,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -162,7 +162,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -181,19 +181,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Achtung: Das -1 ist wichtig, denn <i>len(obst)</i> gibt in diesem Fall ja 4 zurück. Wenn wir aber mit 0 zu zählen anfangen, steht \"weintraube\" an Stelle 3 und nicht an Stelle 4. Einen Listeneintrag mit Index 4 gibt es nicht, wir würden also einen Fehler bekommen. " + "Achtung: Das -1 ist wichtig, denn <i>len(obst)</i> gibt in diesem Fall ja 4 zurück. Wenn wir aber mit 0 zu zählen anfangen, steht \"Weintraube\" an Stelle 3 und nicht an Stelle 4. Einen Listeneintrag mit Index 4 gibt es nicht, wir würden also einen Fehler erhalten. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Wenn man an eine Liste einen neuen Eintrag anhängen will, verwendet man <b>append</b>:" + "Wenn man an eine Liste einen neuen Eintrag anhängen will, verwendet man <b>append()</b>:" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -218,7 +218,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -230,8 +230,8 @@ } ], "source": [ - "vorrat = {\"Apfel\": 4, \"Banane\": 3, \"Weintraube\": 24} #beachte die geschweiften Klammern und Anführungszeichen!\n", - "anzahl_apfel = vorrat[\"Apfel\"] #greife auf den Wert (value) des Schlüssels (key) \"apfel\" zu\n", + "vorrat = {\"Apfel\": 4, \"Banane\": 3, \"Weintraube\": 24} #geschweiften Klammern und Anführungszeichen beachten!\n", + "anzahl_apfel = vorrat[\"Apfel\"] #greife auf den Wert (value) des Schlüssels (key) \"Apfel\" zu\n", "print(\"Es sind noch \"+ str(anzahl_apfel) + \" Äpfel verfügbar.\")\n" ] }, @@ -244,7 +244,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -272,7 +272,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -300,7 +300,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -326,7 +326,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -343,6 +343,13 @@ "for v in apfel.values():\n", " print(v)" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<b>Tipp: Sie haben nun das benötigte Wissen, um Übung 2 im Übungsordner zu bearbeiten.</b>" + ] } ], "metadata": { diff --git a/Tutorials/Grundlagen 3 - Funktionen.ipynb b/Tutorials/Grundlagen 3 - Funktionen.ipynb index 8e32b41..ff5a23b 100644 --- a/Tutorials/Grundlagen 3 - Funktionen.ipynb +++ b/Tutorials/Grundlagen 3 - Funktionen.ipynb @@ -11,7 +11,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Funktionen werden an dieser Stelle nur kurz behandelt, weil wir in der späteren Aufgabenstellung noch keine selbst schreiben werden. Dennoch werden wir immer wieder Funktionen aus externen Libraries verwenden und Sie sollten deshalb Kenntnis darüber haben, was sie bedeuten.\n", + "Funktionen werden an dieser Stelle nur kurz behandelt, weil wir in der späteren Aufgabenstellung noch keine selbst schreiben werden. Dennoch werden wir immer wieder Funktionen aus externen <b>Code-Bibliotheken</b> (Libraries) verwenden und Sie sollten deshalb Kenntnis darüber haben, was sie bedeuten.\n", "\n", "Funktionen dienen in erster Linie der Strukturierung und Wiederverwendung von Code. Statt den Code einer häufig ausgeführten Berechnung immer wieder aufzuschreiben, ist es viel sinnvoller, ihn in eine Funktion zu packen und dann mit einer Zeile Code einfach nur diese Funktion aufzurufen. Außerdem kann eine Funktion über eine Bibliothek auch anderen zur Verfügung gestellt werden, die sich dann die Mühe ersparen können, die Funktion selbst zu programmieren.\n", "\n", @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -37,7 +37,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -63,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -75,12 +75,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die Parameter x und y sind letztlich nur Variablen, d.h. sie könnten auch anders heißen. Eine Funktion kann auch mehr oder weniger bzw. gar keine Parameter (wie im vorherigen Beispiel) haben. Sie werden innerhalb der Funktion zur Berechnung des gewünschten Ergebnisses verwendet." + "Die Parameter x und y sind letztlich nur Variablen, d.h. sie könnten auch anders heißen. Eine Funktion kann auch mehr oder weniger bzw. gar keine Parameter (wie im vorherigen Beispiel) haben. Die Parameterwerte werden innerhalb der Funktion zur Berechnung des gewünschten Ergebnisses verwendet." ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -102,25 +102,25 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Als letztes Beispiel binden wir die <i>random</i>-Module der externen Library <b>numpy</b> ein, um zwei dort angebotene Funktionen zur Erstellung von Zufallszahlen zu nutzen. " + "Als letztes Beispiel binden wir die <i>random</i>-Module der externen Bibliothek <b>numpy</b> ein, um zwei Funktionen zur Erstellung von Zufallszahlen zu nutzen. " ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "-0.6399422028697694\n", - "[27 80 77 98]\n" + "0.5251677904507656\n", + "[65 80 89 34]\n" ] } ], "source": [ - "import numpy.random as npr\n", + "import numpy.random as npr #Hiermit binden wir die externen numpy.random-Module ein und kürzen sie ab sofort mit npr ab\n", "zufallszahl = npr.normal() #Aufruf der Funktion \"normal()\", die eine einzelne Zufallszahl generiert\n", "print(zufallszahl)\n", "zufallszahlen = npr.randint(low=1, high=100, size=4) #Generieren von vier Zufallszahlen zwischen 1 und 100\n", diff --git a/Tutorials/Grundlagen 4 - Pandas DataFrames.ipynb b/Tutorials/Grundlagen 4 - Pandas DataFrames.ipynb index 8b39872..34aa35f 100644 --- a/Tutorials/Grundlagen 4 - Pandas DataFrames.ipynb +++ b/Tutorials/Grundlagen 4 - Pandas DataFrames.ipynb @@ -11,14 +11,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die zuvor verwendeten Listen und Dictionaries sind interner Teil von Python und können ohne weiteres sofort verwendet werden. Es gibt aber auch Module von externen Code-\"Bibliotheken\"/Libraries, die man einbinden kann und die noch viele weitere Funktionalitäten anbieten, je nachdem was man gerade braucht. Ein Beispiel sind <b>DataFrames</b> von der Python-Bibliothek \"Pandas\". Bei DataFrames handelt es sich um eine spezielle Datenstruktur, die mit Tabellen vergleichbar sind. In der Handhabung ähneln sie zudem den bereits behandelten Dictionaries.\n", + "Die zuvor verwendeten Listen und Dictionaries sind interner Teil von Python und können ohne weiteres sofort verwendet werden. Wie bereits erwähnt gibt es aber auch Module von externen Code-Bibliotheken, die noch viele weitere Funktionalitäten anbieten. Die numpy-Funktionen zur Generierung von Zufallszahlen sind ein Beispiel dafür. Ein weiteres sind <b>DataFrames</b> aus der Python-Bibliothek <b>Pandas</b>. Bei einem DataFrame handelt es sich um eine spezielle Datenstruktur, die mit einer Tabelle vergleichbar ist. In der Handhabung ähneln DataFrames zudem den bereits behandelten Dictionaries.\n", "\n", "Grundsätzlich gilt: Die Online-Dokumentation der entsprechenden Bibliothek gibt detailliert Auskunft darüber, wie die Syntax der angebotenen Komponenten aussehen muss, welche Funktionen angeboten werden, etc. In unserem Fall schaut man also im Zweifel unter https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html nach." ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 76, "metadata": {}, "outputs": [ { @@ -46,7 +46,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 77, "metadata": {}, "outputs": [ { @@ -75,12 +75,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\"NaN\" steht für \"Not a Number\" und bedeutet hier, dass die Tabelle noch keine gültigen Daten enthält. Es gibt übrigens viele verschiedene Möglichkeiten, ein DataFrame anzulegen und mit Werten zu füllen. Hier ein Beispiel mit einem Dictionary mit Spaltennamen als Keys und Listen als Werten für die Spalte. Das 0 und 1 am linken Rand ist ein namenloser Zeilen-Index, der von 0 aufwärts gezählt wird." + "<b>NaN</b> steht für \"Not a Number\" und weist darauf hin, dass die Tabelle noch keine gültigen Daten enthält. Es gibt übrigens viele verschiedene Möglichkeiten, ein DataFrame anzulegen und mit Werten zu füllen. Hier ein Beispiel mit einem Dictionary, dessen Keys die Spaltennamen und deren Values die Spaltenwerte angeben. Das 0 und 1 am linken Rand ist ein namenloser Zeilen-Index, der von 0 aufwärts gezählt wird." ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 78, "metadata": {}, "outputs": [ { @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 79, "metadata": {}, "outputs": [ { @@ -136,7 +136,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 80, "metadata": {}, "outputs": [ { @@ -166,8 +166,10 @@ }, { "cell_type": "code", - "execution_count": 31, - "metadata": {}, + "execution_count": 81, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", @@ -206,7 +208,7 @@ } ], "source": [ - "aerzte = pd.DataFrame(pd.read_csv(\"../Daten/HNO_Aerzte_CSV.csv\")) \n", + "aerzte = pd.DataFrame(pd.read_csv(\"../Daten/HNO_Aerzte_Auszug.csv\")) \n", "print(aerzte)" ] }, @@ -219,7 +221,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 82, "metadata": {}, "outputs": [ { @@ -237,7 +239,7 @@ } ], "source": [ - "query = aerzte[\"Adresse\"] == \"Heegbarg 16\"\n", + "query = aerzte[\"Adresse\"] == \"Heegbarg 16\" #die eigentliche Abfrage (sie gibt einen 'True' oder 'False'-Wert zurück)\n", "aerzte_heegbarg = aerzte[query] #oder alles in einer Zeile: aerzte[aerzte[\"Adresse\"] == \"Heegbarg 16\"]\n", "print(aerzte_heegbarg)" ] @@ -246,14 +248,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Wir könnten das Ergebnis der Selektion auch direkt wieder in der ursprünglichen Variable <i>aerzte</i> speichern. Dann hätten wir diese Variable aber überschrieben und könnten im weiteren Verlauf somit nur noch mit diesen beiden Ärzten weiterarbeiten, es sei denn wir würden die komplette Datei nochmal neu einlesen.\n", + "Wir könnten das Ergebnis der Selektion auch direkt wieder in der ursprünglichen Variable <i>aerzte</i> speichern. Dann hätten wir diese Variable aber überschrieben und könnten im weiteren Verlauf somit nur noch mit den selektierten Ärzten weiterarbeiten, es sei denn wir würden die komplette Datei nochmal neu einlesen.\n", "\n", "Hier noch eine andere Abfrage:" ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 83, "metadata": {}, "outputs": [ { @@ -275,12 +277,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Wieso wir hier kein Ergebnis erhalten liegt daran, dass die Postleitzahlen nicht als Strings, sondern als Zahlen gespeichert werden. Zur Kontrolle können wir uns die Datentypen der Tabelle wie folgt ausgeben lassen:" + "Dass wir hier kein Ergebnis erhalten liegt daran, dass die Postleitzahlen nicht als Strings, sondern als Zahlen gespeichert sind. Zur Kontrolle können wir uns die Datentypen der Tabelle wie folgt ausgeben lassen:" ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 84, "metadata": {}, "outputs": [ { @@ -311,7 +313,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 85, "metadata": {}, "outputs": [ { @@ -335,12 +337,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Alternativ können wir festlegen, dass die Spalte als String interpretiert werden soll:" + "Alternativ können wir festlegen, dass die Spalte als String interpretiert werden soll. " ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 86, "metadata": {}, "outputs": [ { @@ -364,20 +366,47 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Mithilfe von <i>df[\"PLZ\"] = df[\"PLZ\"].astype(str)</i> könnten wir sogar den Datentyp der kompletten Spalte ändern. Im Moment wollen wir sie aber noch als Ganzzahl belassen." + "Bei Bedarf könnten wir sogar den Datentyp der kompletten Spalte ändern:" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ID int64\n", + "Fachgebiet1 object\n", + "Adresse object\n", + "PLZ object\n", + "Privatarzt float64\n", + "Stadt object\n", + "Land object\n", + "dtype: object\n" + ] + } + ], + "source": [ + "aerzte[\"PLZ\"] = aerzte[\"PLZ\"].astype(str)\n", + "print(aerzte.dtypes)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Um Excel-Files einzulesen, gehen wir wie folgt vor:" + "Haben wir unsere Tabelle als Excel-Datei vorliegen, gehen wir wie folgt vor:" ] }, { "cell_type": "code", - "execution_count": 37, - "metadata": {}, + "execution_count": 88, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", @@ -415,7 +444,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 89, "metadata": {}, "outputs": [ { @@ -453,7 +482,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 90, "metadata": {}, "outputs": [ { @@ -485,12 +514,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Achtung: Es werden alle vorgenommenen Änderungen verloren gehen, sobald wir unser Programm beenden! Um die Tabelle dauerhaft zu speichern, sollte man sie am Ende also nochmal explizit als Datei exportieren (z.B. mit <b>to_csv</b>). Im Folgenden speichern wir nur die ersten fünf Zeilen unserer Tabelle in einer neuen Datei namens \"Selektion\"." + "Achtung: Alle vorgenommenen Änderungen werden verloren gehen, sobald wir unser Programm beenden! Um die Tabelle dauerhaft zu speichern, sollte man sie am Ende also nochmal explizit als Datei exportieren (z.B. mit <b>to_csv()</b>). Im Folgenden speichern wir nur die ersten fünf Zeilen unserer Tabelle in einer neuen Datei namens <b>Selektion</b>." ] }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 91, "metadata": {}, "outputs": [], "source": [ @@ -502,12 +531,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ähnlich wie beim Anlegen der \"Bundesland\"-Spalte kann man auch Spalten anlegen, die das Ergebnis einer mathematischen Berechnung zwischen anderen Spalten sind - vorausgesetzt, sie sind als Zahlenformat gespeichert. Um das auszuprobieren, legen wir eine neue Spalte \"komische_berechnung\" an, die das Ergebnis der Division der Werte in der Spalte \"ID\" durch die Werte in der Spalte \"PLZ\" beinhaltet. Diese Berechnung ergibt keinen Sinn, soll aber auch nur das Prinzip verdeutlichen." + "Ähnlich wie beim Anlegen der \"Bundesland\"-Spalte kann man auch Spalten anlegen, die das Ergebnis einer mathematischen Berechnung zwischen anderen Spalten sind - vorausgesetzt, sie sind als Zahlenformat gespeichert. Um das auszuprobieren, legen wir eine neue Spalte names <b>berechnung </b> an, die das Ergebnis der Division der Werte in der Spalte \"ID\" durch die Werte in der Spalte \"PLZ\" beinhaltet. Diese Berechnung ergibt keinerlei Sinn, soll aber auch nur das Prinzip verdeutlichen." ] }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 92, "metadata": {}, "outputs": [ { @@ -521,17 +550,17 @@ "3 125 Hals-Nasen-Ohrenheilkunde Wandsbeker Marktstr. 73 22041 NaN \n", "4 148 Hals-Nasen-Ohrenheilkunde Sand 35 21073 NaN \n", "\n", - " Stadt Land Bundesland komische_berechnung \n", - "0 Hamburg Germany Hamburg 0.000088 \n", - "1 Hamburg Germany Hamburg 0.002555 \n", - "2 Hamburg Germany Hamburg 0.004613 \n", - "3 Hamburg Germany Hamburg 0.005671 \n", - "4 Hamburg Germany Hamburg 0.007023 \n" + " Stadt Land Bundesland berechnung \n", + "0 Hamburg Germany Hamburg 0.000088 \n", + "1 Hamburg Germany Hamburg 0.002555 \n", + "2 Hamburg Germany Hamburg 0.004613 \n", + "3 Hamburg Germany Hamburg 0.005671 \n", + "4 Hamburg Germany Hamburg 0.007023 \n" ] } ], "source": [ - "df[\"komische_berechnung\"] = df[\"ID\"]/df[\"PLZ\"]\n", + "df[\"berechnung\"] = df[\"ID\"]/df[\"PLZ\"]\n", "print(df)" ] }, @@ -539,14 +568,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Es sollte erwähnt werden, dass es noch andere Methoden gibt, die u.a. auf eine korrekte Indizierung der neu angelegten Spalten im DataFrame Wert legen. Aber für unseren Bedarf ist die einfache Methode von oben erstmal ausreichend. \n", + "Es sollte erwähnt werden, dass es noch andere Methoden zum Anlegen von Spalten gibt, die u.a. auf eine korrekte Indizierung der Spalten im DataFrame Wert legen. Aber für unseren Bedarf ist die einfache Methode von oben erstmal ausreichend. \n", "\n", "Nun löschen wir diese Spalte lieber wieder:" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 93, "metadata": {}, "outputs": [ { @@ -570,7 +599,7 @@ } ], "source": [ - "df = df.drop(\"komische_berechnung\", 1) #Hierbei weist 1 auf eine Spalte hin und 0 auf eine Zeile. \n", + "df = df.drop(\"berechnung\", 1) #Hierbei weist 1 auf eine Spalte hin und 0 auf eine Zeile. \n", "print(df)" ] }, @@ -578,14 +607,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Es gibt auch Fälle, da wollen wir eine neue Spalte anlegen, die in etwas komplexerer Abhängigkeit zu einer anderen Spalte steht, oder wir wollen bestehende Werte in Abhängigkeit von verschiedenen anderen Informationen updaten. So etwas kann bei DataFrames eine relativ komplizierte und unintutive Syntax erfordern.\n", + "Es gibt auch Fälle, da wollen wir eine neue Spalte anlegen, die in etwas komplexerer Abhängigkeit zu einer anderen Spalte steht, oder wir wollen bestehende Werte in Abhängigkeit von verschiedenen anderen Informationen überschreiben. So etwas kann bei DataFrames schnell eine relativ komplizierte und unintutive Syntax erfordern.\n", "\n", "Um das zu umgehen, können wir aber auch einfach unser bestehendes Wissen über Schleifen, Listen und Dictionaries nutzen. Wir legen zunächst eine leere Liste an, iterieren dann durch das DataFrame und legen für jede Zeile ein neues Dictionary mit den gewünschten Zeilen-Werten an. Entweder erstellt man das Dictionary komplett neu, oder man nutzt die bereits vorhandenen Zeilenwerte und ergänzt diese nur. Danach fügt man das Dictionary der Liste hinzu und am Ende erstellt man aus dieser Liste ein neues DataFrame. Der folgende Codeausschnitt verdeutlicht, wie man durch ein DataFrame iteriert:" ] }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 94, "metadata": {}, "outputs": [ { @@ -593,7 +622,6 @@ "output_type": "stream", "text": [ "0\n", - "Unnamed: 0 0\n", "ID 2\n", "Fachgebiet Hals-Nasen-Ohrenheilkunde\n", "Adresse Waitzstr. 7\n", @@ -605,7 +633,6 @@ "Name: 0, dtype: object\n", "<class 'pandas.core.series.Series'>\n", "1\n", - "Unnamed: 0 1\n", "ID 52\n", "Fachgebiet Hals-Nasen-Ohrenheilkunde\n", "Adresse Neuer Wall 43\n", @@ -617,7 +644,6 @@ "Name: 1, dtype: object\n", "<class 'pandas.core.series.Series'>\n", "2\n", - "Unnamed: 0 2\n", "ID 102\n", "Fachgebiet Hals-Nasen-Ohrenheilkunde\n", "Adresse Möllner Landstr. 26 a\n", @@ -629,7 +655,6 @@ "Name: 2, dtype: object\n", "<class 'pandas.core.series.Series'>\n", "3\n", - "Unnamed: 0 3\n", "ID 125\n", "Fachgebiet Hals-Nasen-Ohrenheilkunde\n", "Adresse Wandsbeker Marktstr. 73\n", @@ -641,7 +666,6 @@ "Name: 3, dtype: object\n", "<class 'pandas.core.series.Series'>\n", "4\n", - "Unnamed: 0 4\n", "ID 148\n", "Fachgebiet Hals-Nasen-Ohrenheilkunde\n", "Adresse Sand 35\n", @@ -656,7 +680,6 @@ } ], "source": [ - "df = pd.DataFrame(pd.read_csv(\"../Daten/Selektion.csv\", sep=','))\n", "for index, data in df.iterrows(): # Syntax, um durch die Zeilen (Rows = Reihen = Zeilen) eines DataFrame zu iterieren\n", " print(index) #Index der aktuellen Zeile\n", " print(data) #Daten in dieser Zeile\n", @@ -667,23 +690,23 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Der Datentyp \"Series\" sagt uns noch nichts. Wie bei einem Dictionary kann man jedoch z.B. mit data[\"Adresse\"] auf einen Series-Eintrag zugreifen. Außerdem lässt sich die komplette Series auch einfach in ein Dictionary umwandeln:" + "Der Datentyp <b>Series</b> sagt uns noch nichts. Wie bei einem Dictionary kann man jedoch z.B. mit data[\"Adresse\"] auf einen Series-Eintrag zugreifen. Außerdem lässt sich die komplette Series auch einfach in ein Dictionary umwandeln:" ] }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 95, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{'Unnamed: 0': 0, 'ID': 2, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Waitzstr. 7', 'PLZ': 22607, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg'}\n", - "{'Unnamed: 0': 1, 'ID': 52, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Neuer Wall 43', 'PLZ': 20354, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg'}\n", - "{'Unnamed: 0': 2, 'ID': 102, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Möllner Landstr. 26 a', 'PLZ': 22111, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg'}\n", - "{'Unnamed: 0': 3, 'ID': 125, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Wandsbeker Marktstr. 73', 'PLZ': 22041, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg'}\n", - "{'Unnamed: 0': 4, 'ID': 148, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Sand 35', 'PLZ': 21073, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg'}\n" + "{'ID': 2, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Waitzstr. 7', 'PLZ': 22607, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg'}\n", + "{'ID': 52, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Neuer Wall 43', 'PLZ': 20354, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg'}\n", + "{'ID': 102, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Möllner Landstr. 26 a', 'PLZ': 22111, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg'}\n", + "{'ID': 125, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Wandsbeker Marktstr. 73', 'PLZ': 22041, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg'}\n", + "{'ID': 148, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Sand 35', 'PLZ': 21073, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg'}\n" ] } ], @@ -701,7 +724,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 96, "metadata": {}, "outputs": [], "source": [ @@ -721,33 +744,33 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 98, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[{'Unnamed: 0': 0, 'ID': 2, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Waitzstr. 7', 'PLZ': 22607, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg', 'Stadtteil': 'Othmarschen'}, {'Unnamed: 0': 1, 'ID': 52, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Neuer Wall 43', 'PLZ': 20354, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg', 'Stadtteil': 'Neustadt'}, {'Unnamed: 0': 2, 'ID': 102, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Möllner Landstr. 26 a', 'PLZ': 22111, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg', 'Stadtteil': 'Unbekannt'}, {'Unnamed: 0': 3, 'ID': 125, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Wandsbeker Marktstr. 73', 'PLZ': 22041, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg', 'Stadtteil': 'Unbekannt'}, {'Unnamed: 0': 4, 'ID': 148, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Sand 35', 'PLZ': 21073, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg', 'Stadtteil': 'Harburg'}]\n", + "[{'ID': 2, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Waitzstr. 7', 'PLZ': 22607, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg', 'Stadtteil': 'Othmarschen'}, {'ID': 52, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Neuer Wall 43', 'PLZ': 20354, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg', 'Stadtteil': 'Neustadt'}, {'ID': 102, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Möllner Landstr. 26 a', 'PLZ': 22111, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg', 'Stadtteil': 'Unbekannt'}, {'ID': 125, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Wandsbeker Marktstr. 73', 'PLZ': 22041, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg', 'Stadtteil': 'Unbekannt'}, {'ID': 148, 'Fachgebiet': 'Hals-Nasen-Ohrenheilkunde', 'Adresse': 'Sand 35', 'PLZ': 21073, 'Privatarzt': nan, 'Stadt': 'Hamburg', 'Land': 'Germany', 'Bundesland': 'Hamburg', 'Stadtteil': 'Harburg'}]\n", ".................................................................\n", - " Unnamed: 0 ID Fachgebiet Adresse PLZ \\\n", - "0 0 2 Hals-Nasen-Ohrenheilkunde Waitzstr. 7 22607 \n", - "1 1 52 Hals-Nasen-Ohrenheilkunde Neuer Wall 43 20354 \n", - "2 2 102 Hals-Nasen-Ohrenheilkunde Möllner Landstr. 26 a 22111 \n", - "3 3 125 Hals-Nasen-Ohrenheilkunde Wandsbeker Marktstr. 73 22041 \n", - "4 4 148 Hals-Nasen-Ohrenheilkunde Sand 35 21073 \n", + " ID Fachgebiet Adresse PLZ Privatarzt \\\n", + "0 2 Hals-Nasen-Ohrenheilkunde Waitzstr. 7 22607 NaN \n", + "1 52 Hals-Nasen-Ohrenheilkunde Neuer Wall 43 20354 NaN \n", + "2 102 Hals-Nasen-Ohrenheilkunde Möllner Landstr. 26 a 22111 NaN \n", + "3 125 Hals-Nasen-Ohrenheilkunde Wandsbeker Marktstr. 73 22041 NaN \n", + "4 148 Hals-Nasen-Ohrenheilkunde Sand 35 21073 NaN \n", "\n", - " Privatarzt Stadt Land Bundesland Stadtteil \n", - "0 NaN Hamburg Germany Hamburg Othmarschen \n", - "1 NaN Hamburg Germany Hamburg Neustadt \n", - "2 NaN Hamburg Germany Hamburg Unbekannt \n", - "3 NaN Hamburg Germany Hamburg Unbekannt \n", - "4 NaN Hamburg Germany Hamburg Harburg \n" + " Stadt Land Bundesland Stadtteil \n", + "0 Hamburg Germany Hamburg Othmarschen \n", + "1 Hamburg Germany Hamburg Neustadt \n", + "2 Hamburg Germany Hamburg Unbekannt \n", + "3 Hamburg Germany Hamburg Unbekannt \n", + "4 Hamburg Germany Hamburg Harburg \n" ] } ], "source": [ - "liste_mit_zeilen = list() #Synonym zu neu = [], d.h. Erstellen einer neuen leeren Liste\n", + "liste_mit_zeilen = list() #Synonym zu liste_mit_zeilen = [], d.h. Erstellen einer neuen leeren Liste\n", "for index, data in df.iterrows(): \n", " zeile = data.to_dict() #erhalte die bereits bestehenden Werte in dieser Zeile als Dictionary\n", " if zeile[\"Adresse\"] in zusatz_infos.keys(): #falls dieser Schlüssel im separaten Dictionary existiert...\n", @@ -755,7 +778,7 @@ " else:\n", " zeile[\"Stadtteil\"] = \"Unbekannt\"\n", " liste_mit_zeilen.append(zeile)\n", - "print(liste_mit_zeilen) #Liste mit Zeilen in Form von Dictionaries!\n", + "print(liste_mit_zeilen) #Die Liste ist nun mit Zeilen in Form von Dictionaries gefüllt!\n", "df = pd.DataFrame(liste_mit_zeilen) #aus einer Liste mit Dictionaries können wir wieder ein DataFrame basteln!\n", "print(\".................................................................\")\n", "print(df)" -- GitLab