Hallo und Herzlich Willkommen =)
In dieser Lektion lernst du das pandas Modul kennen, das du zum Aufbereiten und Analysieren von Daten mit Python nutzen kannst.

Beim Arbeiten mit pandas erstellst du aus Daten wie CSVs, Excel, SQL oder JSON Python Objekte vom DataFrame Datentyp, auf welche du dann über Zeilen und Spalten zugreifen kannst.
Dieses Format macht das Arbeiten mit Daten deutlich intuitiver als wenn du Listen oder Dictionaries dafür verwendest.

Um pandas auf deinem Rechner zu installieren kannst du den in der Eingabeaufforderung den „pip install pandas“ Befehl ausführen.
Anschließend kannst du es in deinem Projekt importieren.

# Installation
# pip install pandas

# Importieren
import pandas as pd
import numpy as np

Du wirst feststellen, dass es von den meisten Entwicklern abgekürzt als pd importiert wird.

Daten laden und anschauen

Um ein DataFrame Objekt aus anderen Python Objekten zu erstellen, kannst du die pd.DataFrame Funktion nutzen und das gewünschte Objekt als Parameter übergeben.
Mit .shape kannst du dir die Form deines DataFrames anzeigen lassen.
Die .head() und .tail() Funktionen zeigen dir den Kopf beziehungsweise die letzten Zeilen deines DataFrames.

# Aus Python Objekten
matrix = np.array([[0, 1], [1, 1], [2, 2], [3, 3], [4, 5], [5, 8], [6, 13], [7, 21], [8, 34], [9, 55]])
pythonDaten = pd.DataFrame(matrix)
print(type(pythonDaten))
print(pythonDaten.shape)
print(pythonDaten.head())
print(pythonDaten.tail())

### ERGEBNIS / AUSGABE ###


(10, 2)

   0  1
0  0  1
1  1  1
2  2  2
3  3  3
4  4  5

   0   1
5  5   8
6  6  13
7  7  21
8  8  34
9  9  55

Um Daten aus Dateien zu laden stellt dir Pandas für sehr viele Dateitypen fertige Funktionen wie pd.read_excel für Excel Dateien, pd.read_sql für Datenbanken oder pd.read_json für – wer hätte es gedacht – JSON Dateien zur Verfügung.
In dieser Lektion möchte ich dir diese Funktionalität am Beispiel einer csv Datei zeigen.
Die Datei die ich hier als Beispiel verwende ist eine statistische Übersicht verschiedenster Energie Kennzahlen von der BP Website.
https://www.bp.com/en/global/corporate/energy-economics/statistical-review-of-world-energy.html
Als Beispiel habe ich das Arbeitsblatt über Lithium Förderung aus der bp-stats-review-2020-all-data.xlsx Datei als csv Datei exportiert.

# Aus .csv Dateien
csvDaten = pd.read_csv(r"Daten\bp-stats-review-2020-all-data.csv", sep=";")
print(type(csvDaten))
print(csvDaten.shape)
print(csvDaten.head())
print(csvDaten.tail())
print(csvDaten.columns)

### ERGEBNIS / AUSGABE ###


(10, 33)

  Thousand tonnes of Lithium content 1995 1996 1997  ... Unnamed: 29 Unnamed: 30 Unnamed: 31  Unnamed: 32
0                          Argentina    ^    ^    ^  ...         NaN         NaN         NaN          NaN
1                          Australia  2.2  3.9  1.6  ...         NaN         NaN         NaN          NaN
2                             Brazil    ^    ^    ^  ...         NaN         NaN         NaN          NaN
3                              Chile  2.0  2.7  4.6  ...         NaN         NaN         NaN          NaN
4                              China  0.3  2.8  2.9  ...         NaN         NaN         NaN          NaN

[5 rows x 33 columns]

  Thousand tonnes of Lithium content 1995  1996  1997  ... Unnamed: 29 Unnamed: 30 Unnamed: 31  Unnamed: 32
5                           Portugal  0.2   0.2   0.2  ...         NaN         NaN         NaN          NaN
6                                 US  3.5   4.0   4.0  ...         NaN         NaN         NaN          NaN
7                           Zimbabwe  0.5   0.5   0.7  ...         NaN         NaN         NaN          NaN
8                      Rest of World  0.7   0.7   1.6  ...         NaN         NaN         NaN          NaN
9                        Total World  9.5  14.8  15.6  ...         NaN         NaN         NaN          NaN

[5 rows x 33 columns]

Index(['Thousand tonnes of Lithium content', '1995', '1996', '1997', '1998',
       '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007',
       '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016',
       '2017', '2018', '2019', 'Unnamed: 26', 'Unnamed: 27', 'Unnamed: 28',
       'Unnamed: 29', 'Unnamed: 30', 'Unnamed: 31', 'Unnamed: 32'],
      dtype='object')


Daten aufbereiten

Nachdem du die Rohdaten geladen hast kannst du nun damit anfangen sie für die weiterverarbeitung aufzubereiten.
Eine nützliche Funktion die du dabei häufig nutzen wirst ist .dropna() um Zeilen oder Spalten mit fehlenden Werten zu löschen.

# NaN Spalten löschen
nanSpaltenGeloescht = csvDaten.dropna(axis=“columns“, how=“all“)
print(nanSpaltenGeloescht.head())

### ERGEBNIS / AUSGABE ###
  Thousand tonnes of Lithium content 1995 1996 1997 1998 1999 2000  ...  2013  2014  2015  2016  2017  2018  2019
0                          Argentina    ^    ^    ^  1.1  0.2  0.2  ...   2.5   3.2   3.6   5.8   5.7   6.4   6.4
1                          Australia  2.2  3.9  1.6  1.2  1.5  1.8  ...  10.1  12.4  11.9  14.0  21.3  57.0  40.7
2                             Brazil    ^    ^    ^    ^    ^    ^  ...   0.4   0.2   0.2   0.2   0.2   0.3   0.3
3                              Chile  2.0  2.7  4.6  5.5  5.7  6.7  ...  11.7  12.0  10.9  15.2  15.8  18.8  16.6
4                              China  0.3  2.8  2.9  3.0  2.3  2.4  ...   4.7   2.3   2.0   2.3   6.8   7.1   7.5

[5 rows x 26 columns]

Die wichtigsten Parameter dieser Funktion sind „axis“, bei dem du zwischen „columns“ für Spalten und „index“ für Zeilen wählen kannst, sowie „how“, bei dem du die Wähl zwischen „all“ hast um eine Zeile/Spalte zu löschen wenn alle Einträge keinen Wert haben oder „any“ um eine Zeile/Spalte zu löschen sobald sie einen Eintrag ohne Wert enthält.

Du kannst einzelne Werte durch andere ersetzen indem du die .replace() Funktion nutzt.
Als ersten Parameter übergibst du dafür den Wert den du ersetzen möchtest und anschließend den Wert mit dem jedes Vorkommen ersetzt werden soll.

# ^ mit 0 ersetzen
werteErsetzt = nanSpaltenGeloescht.replace("^", 0)
print(werteErsetzt.head())

### ERGEBNIS / AUSGABE ###
  Thousand tonnes of Lithium content 1995 1996 1997 1998 1999 2000  ...  2013  2014  2015  2016  2017  2018  2019
0                          Argentina    0    0    0  1.1  0.2  0.2  ...   2.5   3.2   3.6   5.8   5.7   6.4   6.4
1                          Australia  2.2  3.9  1.6  1.2  1.5  1.8  ...  10.1  12.4  11.9  14.0  21.3  57.0  40.7
2                             Brazil    0    0    0    0    0    0  ...   0.4   0.2   0.2   0.2   0.2   0.3   0.3
3                              Chile  2.0  2.7  4.6  5.5  5.7  6.7  ...  11.7  12.0  10.9  15.2  15.8  18.8  16.6
4                              China  0.3  2.8  2.9  3.0  2.3  2.4  ...   4.7   2.3   2.0   2.3   6.8   7.1   7.5

[5 rows x 26 columns]

Um eine Teilmenge deines DataFrames auszuwählen, kannst du die Namen der gewünschten Spalten in eckigen Klammern auflisten und das Ergebnis der Abfrage in einer neuen Variable speichern.

# Daten auswählen
laender = nanSpaltenGeloescht["Thousand tonnes of Lithium content"]
print(type(laender))
print(laender.head())

laender2019 = nanSpaltenGeloescht[["Thousand tonnes of Lithium content", "2019"]]
print(type(laender2019))
print(laender2019.head())

### ERGEBNIS / AUSGABE ###

0    Argentina
1    Australia
2       Brazil
3        Chile
4        China
Name: Thousand tonnes of Lithium content, dtype: object


  Thousand tonnes of Lithium content  2019
0                          Argentina   6.4
1                          Australia  40.7
2                             Brazil   0.3
3                              Chile  16.6
4                              China   7.5


Daten Filtern und Sortieren

Um Daten deines DataFrames zu filtern kannst du innerhalb der eckigen Klammern eine Bedingung angeben.

# Länder mit weniger als 1000 t Förderung ausschließen
mehrAls1kt = laender2019[laender2019["2019"] > 1]
print(type(mehrAls1kt))
print(mehrAls1kt.head())

### ERGEBNIS / AUSGABE ###

  Thousand tonnes of Lithium content  2019
0                          Argentina   6.4
1                          Australia  40.7
3                              Chile  16.6
4                              China   7.5
5                           Portugal   1.2

Um deine Daten zu sortieren kannst du die .sort_values() Funktion nutzen.
Als Parameter kannst du dabei „by“ mit dem Namen der Spalte nach der Sortiert werden soll und „ascending“ als True für aufsteigend oder False für absteigende Sortierung übergeben.

# Nach geförderter Masse absteigend sortieren
sortiert = mehrAls1kt.sort_values(by=["2019"], ascending=False)
print(sortiert.head())

### ERGEBNIS / AUSGABE ###
  Thousand tonnes of Lithium content  2019
9                        Total World  77.0
1                          Australia  40.7
3                              Chile  16.6
4                              China   7.5
0                          Argentina   6.4

Abschließend kannst du deine bearbeiteten Daten mit den .to_DATENTYP Funktionen exportieren und abspeichern.
Hier als Beispiel das Exportieren und Speichern als Excel und csv Datei wobei du den gewünschten Speicherort und Dateinamen als Parameter übergibst.
Möglicherweise musst du für das Speichern als Excel Datei zusätzlich das openpyxl Modul installieren.

# Data Frame speichern
sortiert.to_excel(r"Daten\LithiumFoerderung2019.xlsx")  # pip install openpyxl
sortiert.to_csv(r"Daten\LithiumFoerderung2019.csv")

Auch das Pandas Modul bietet natürlich deutlich mehr Funktionen zur Datenaufbereitung, -manipulation und -analyse auf die ich in diesem Rahmen nicht vollumfänglich eingehen kann.
Wichtig ist wie immer, dass du dir bewusst bist, dass dir dieses Werkzeug zur Verfügung steht und eine Vorstellung über die Funktionalitäten hast.
Sobald du in ein tiefgreifenderes Projekt zur Datenanalyse einsteigst, kann ich dir die offizielle Pandas Website empfehlen:
https://pandas.pydata.org/pandas-docs/stable/user_guide/index.html

Wenn du die ersten grundlegenden Funktionen erfolgreich an deinem eigenen Rechner testen konntest, möchte ich dir herzlich zum nächsten großen Schritt gratulieren und freue mich darauf dich gleich in der nächsten Lektion wiederzusehen =)