Kurs
In diesem Tutorial schauen wir uns an, wann und wie wir die SQL-Funktionalität im Rahmen von pandas nutzen können (und wann nicht). Außerdem betrachten wir verschiedene Beispiele für die Umsetzung dieses Ansatzes und vergleichen die Ergebnisse mit gleichwertigem Code in purem pandas.
Warum SQL in pandas verwenden?
Warum sollte man SQL mit pandas kombinieren, wenn pandas bereits ein Komplettpaket für die Datenanalyse ist?
Die Antwort: Gerade bei komplexeren Programmen wirken SQL-Abfragen oft deutlich einfacher und lesbarer als der entsprechende Code in pandas. Das gilt besonders für alle, die zuerst mit SQL gearbeitet und später pandas gelernt haben.
Um die bessere Lesbarkeit von SQL zu verdeutlichen, nehmen wir an, wir haben eine Tabelle (ein DataFrame) namens penguins mit verschiedenen Informationen über Pinguine (mit so einer Tabelle arbeiten wir später im Tutorial). Um alle einzigartigen Arten von männlichen Pinguinen mit einer Flügellänge von mehr als 210 mm zu extrahieren, benötigen wir in pandas folgenden Code:
penguins[(penguins['sex'] == 'Male') & (penguins['flipper_length_mm'] > 210)]['species'].unique()
Die gleiche Information erhalten wir in SQL mit folgendem Code:
SELECT DISTINCT species FROM penguins WHERE sex = 'Male' AND flipper_length_mm > 210
Der zweite, in SQL geschriebene Code liest sich fast wie ein natürlicher englischer Satz und ist damit deutlich intuitiver. Wir können die Lesbarkeit weiter erhöhen, indem wir ihn über mehrere Zeilen aufteilen:
SELECT DISTINCT species
FROM penguins
WHERE sex = 'Male'
AND flipper_length_mm > 210
Nachdem wir die Vorteile der SQL-Nutzung für pandas identifiziert haben, schauen wir uns an, wie wir beides technisch kombinieren.
So verwendest du pandasql
Die Python-Bibliothek pandasql ermöglicht es, pandas-DataFrames mit SQL-Befehlen abzufragen, ohne eine Verbindung zu einem SQL-Server herstellen zu müssen. Unter der Haube nutzt sie die SQLite-Syntax, erkennt automatisch alle pandas-DataFrames und behandelt sie wie reguläre SQL-Tabellen.
Deine Umgebung einrichten
Zuerst installieren wir pandasql:
pip install pandasql
Dann importieren wir die benötigten Pakete:
from pandasql import sqldf
import pandas as pd
Oben importieren wir direkt die Funktion sqldf() aus pandasql, die praktisch die einzige wirklich relevante Funktion der Bibliothek ist. Wie der Name vermuten lässt, dient sie dazu, DataFrames mit SQL-Syntax abzufragen. Darüber hinaus bringt pandasql zwei einfache integrierte Datensätze mit, die sich über die selbsterklärenden Funktionen load_births() und load_meat() laden lassen.
pandasql-Syntax
Die Syntax der Funktion sqldf() ist sehr einfach:
sqldf(query, env=None)
Hier ist query ein Pflichtparameter, der eine SQL-Abfrage als String entgegennimmt, und env—ein optionaler (und selten nützlicher) Parameter, der entweder locals() oder globals() sein kann und sqldf() Zugriff auf die entsprechenden Variablen in deiner Python-Umgebung gibt.
Die Funktion sqldf() gibt das Abfrageergebnis als pandas-DataFrame zurück.
Wann wir pandasql nutzen können
Die Bibliothek pandasql erlaubt die Arbeit mit Daten über die Data Query Language (DQL), einen Teilbereich von SQL. Mit anderen Worten: Mit pandasql können wir Abfragen auf den in einem DataFrame gespeicherten Daten ausführen, um die benötigten Informationen zu erhalten. Konkret können wir Daten lesen, extrahieren, filtern, sortieren, gruppieren, joinen, aggregieren und mathematische oder logische Operationen ausführen.
Wann wir pandasql nicht nutzen können
pandasql unterstützt keine anderen SQL-Teilmengen außer DQL. Das bedeutet, wir können pandasql nicht verwenden, um Tabellen zu verändern (update, truncate, insert etc.) oder Daten in einer Tabelle zu ändern (update, delete oder insert).
Zusätzlich sollten wir, da diese Bibliothek auf SQL-Syntax basiert, die bekannten Eigenheiten von SQLite im Blick behalten.
Beispiele für die Verwendung von pandasql
Jetzt schauen wir uns im Detail an, wie wir mit der Funktion sqldf() aus pandasql SQL-Abfragen auf pandas-DataFrames ausführen. Damit wir üben können, laden wir einen der integrierten Datensätze der seaborn-Bibliothek—penguins:
import seaborn as sns
penguins = sns.load_dataset('penguins')
print(penguins.head())
Ausgabe:
species island bill_length_mm bill_depth_mm flipper_length_mm \
0 Adelie Torgersen 39.1 18.7 181.0
1 Adelie Torgersen 39.5 17.4 186.0
2 Adelie Torgersen 40.3 18.0 195.0
3 Adelie Torgersen NaN NaN NaN
4 Adelie Torgersen 36.7 19.3 193.0
body_mass_g sex
0 3750.0 Male
1 3800.0 Female
2 3250.0 Female
3 NaN NaN
4 3450.0 Female
Wenn du deine SQL-Kenntnisse auffrischen willst, ist unser Skill-Lernpfad SQL Fundamentals ein guter Startpunkt.
Daten mit pandasql extrahieren
print(sqldf('''SELECT species, island
FROM penguins
LIMIT 5'''))
Ausgabe:
species island
0 Adelie Torgersen
1 Adelie Torgersen
2 Adelie Torgersen
3 Adelie Torgersen
4 Adelie Torgersen
Oben haben wir Informationen über Art und Fundort der ersten fünf Pinguine aus dem DataFrame penguins extrahiert. Beachte, dass der Aufruf von sqldf() einen pandas-DataFrame zurückliefert:
print(type(sqldf('''SELECT species, island
FROM penguins
LIMIT 5''')))
Ausgabe:
<class 'pandas.core.frame.DataFrame'>
In purem pandas wäre es:
print(penguins[['species', 'island']].head())
Ausgabe:
species island
0 Adelie Torgersen
1 Adelie Torgersen
2 Adelie Torgersen
3 Adelie Torgersen
4 Adelie Torgersen
Ein weiteres Beispiel ist das Extrahieren einzigartiger Werte aus einer Spalte:
print(sqldf('''SELECT DISTINCT species
FROM penguins'''))
Ausgabe:
species
0 Adelie
1 Chinstrap
2 Gentoo
In pandas wäre es:
print(penguins['species'].unique())
Ausgabe:
['Adelie' 'Chinstrap' 'Gentoo']
Daten mit pandasql sortieren
print(sqldf('''SELECT body_mass_g
FROM penguins
ORDER BY body_mass_g DESC
LIMIT 5'''))
Ausgabe:
body_mass_g
0 6300.0
1 6050.0
2 6000.0
3 6000.0
4 5950.0
Hier haben wir die Pinguine nach Körpermasse absteigend sortiert und die fünf höchsten Werte angezeigt.
In pandas wäre es:
print(penguins['body_mass_g'].sort_values(ascending=False,
ignore_index=True).head())
Ausgabe:
0 6300.0
1 6050.0
2 6000.0
3 6000.0
4 5950.0
Name: body_mass_g, dtype: float64
Daten mit pandasql filtern
Probieren wir dasselbe Beispiel aus dem Kapitel „Warum SQL in pandas verwenden“: die einzigartigen Arten männlicher Pinguine mit einer Flügellänge von mehr als 210 mm extrahieren:
print(sqldf('''SELECT DISTINCT species
FROM penguins
WHERE sex = 'Male'
AND flipper_length_mm > 210'''))
Ausgabe:
species
0 Chinstrap
1 Gentoo
Hier haben wir die Daten anhand von zwei Bedingungen gefiltert: sex = 'Male' und flipper_length_mm > 210.
Das gleiche in pandas wirkt etwas sperriger:
print(penguins[(penguins['sex'] == 'Male') & (penguins['flipper_length_mm'] > 210)]['species'].unique())
Ausgabe:
['Chinstrap' 'Gentoo']
Daten mit pandasql gruppieren und aggregieren
Jetzt gruppieren und aggregieren wir Daten, um die längste Schnabellänge je Art im DataFrame zu finden:
print(sqldf('''SELECT species, MAX(bill_length_mm)
FROM penguins
GROUP BY species'''))
Ausgabe:
species MAX(bill_length_mm)
0 Adelie 46.0
1 Chinstrap 58.0
2 Gentoo 59.6
Der entsprechende Code in pandas:
print(penguins[['species', 'bill_length_mm']].groupby('species', as_index=False).max())
Ausgabe:
species bill_length_mm
0 Adelie 46.0
1 Chinstrap 58.0
2 Gentoo 59.6
Mathematische Operationen mit pandasql durchführen
Mit pandasql können wir problemlos mathematische oder logische Operationen auf den Daten ausführen. Angenommen, wir wollen für jeden Pinguin das Verhältnis von Schnabellänge zu -tiefe berechnen und die fünf höchsten Werte anzeigen:
print(sqldf('''SELECT bill_length_mm / bill_depth_mm AS length_to_depth
FROM penguins
ORDER BY length_to_depth DESC
LIMIT 5'''))
Ausgabe:
length_to_depth
0 3.612676
1 3.510490
2 3.505882
3 3.492424
4 3.458599
Beachte, dass wir diesmal den Alias length_to_depth für die Spalte mit den Verhältniswerten verwendet haben. Andernfalls würde die Spalte den wenig lesbaren Namen bill_length_mm / bill_depth_mm tragen.
In pandas müssten wir zuerst eine neue Spalte mit den Verhältniswerten erstellen:
penguins['length_to_depth'] = penguins['bill_length_mm'] / penguins['bill_depth_mm']
print(penguins['length_to_depth'].sort_values(ascending=False, ignore_index=True).head())
Ausgabe:
0 3.612676
1 3.510490
2 3.505882
3 3.492424
4 3.458599
Name: length_to_depth, dtype: float64
Fazit
Zusammenfassend haben wir in diesem Tutorial beleuchtet, warum und wann wir die Funktionalität von SQL für pandas kombinieren können, um besseren, effizienteren Code zu schreiben. Wir haben besprochen, wie man die pandasql-Bibliothek dafür einrichtet und nutzt und welche Einschränkungen dieses Paket hat. Abschließend haben wir zahlreiche gängige Beispiele für den praktischen Einsatz von pandasql betrachtet und den Code jeweils mit der entsprechenden Lösung in pandas verglichen.
Jetzt hast du alles, was du brauchst, um SQL für pandas in realen Projekten einzusetzen. Ein idealer Ort zum Üben ist das DataLab, DataCamps KI-unterstütztes Datennotizbuch mit starker SQL-Unterstützung.
Lass dich für deine Traumrolle als Data Engineer zertifizieren
Unsere Zertifizierungsprogramme helfen dir, dich von anderen abzuheben und potenziellen Arbeitgebern zu beweisen, dass deine Fähigkeiten für den Job geeignet sind.

