Wie man Polars JSON-Daten verarbeitet: Ein Schnellstart Guide
Updated on
Träumen Sie davon, JSON-Daten wie ein Profi zu verarbeiten? Willkommen an Bord! Heute werden wir Polars erkunden, eine leistungsstarke DataFrame-Bibliothek in Python und Rust, mit besonderem Fokus auf der Verarbeitung von JSON-Daten. Mit seiner blitzschnellen Leistung und den einfach zu bedienenden Methoden werden Sie sehen, warum Polars immer mehr zur ersten Wahl für Datenwissenschaftler auf der ganzen Welt wird.
Konvertieren einer JSON-String-Spalte in ein Dictionary in Polars
Oftmals haben Sie möglicherweise einen DataFrame, in dem eine Spalte JSON-Strings enthält. Nehmen wir an, Sie möchten diesen DataFrame basierend auf bestimmten Schlüsseln oder Werten innerhalb dieser JSON-Strings filtern. Der robusteste Weg, dies zu behandeln, besteht darin, die JSON-Strings in ein Dictionary umzuwandeln. Polars arbeitet jedoch nicht mit generischen Dictionaries. Stattdessen verwendet es ein Konzept namens "structs", bei dem jedem Dictionary-Schlüssel ein struct-"Feldname" zugeordnet wird und der entsprechende Dictionary-Wert zum Wert dieses Feldes wird.
Hier kommt der Knackpunkt: Das Erstellen einer Serie vom Typ struct hat zwei Hauptbedingungen:
- Alle structs müssen die gleichen Feldnamen haben.
- Die Feldnamen müssen in derselben Reihenfolge aufgeführt sein.
Aber keine Sorge! Polars bietet eine Funktion namens json_path_match
, die Werte basierend auf der JSONPath-Syntax extrahiert. Damit können Sie überprüfen, ob ein Schlüssel vorhanden ist, und seinen Wert abrufen. So geht's:
import polars as pl
json_list = [
"""{"name": "Maria", "position": "Entwickler", "büro": "Seattle"}""",
"""{"name": "Josh", "position": "Analyst", "beendigungsdatum": "2020-01-01"}""",
"""{"name": "Jorge", "position": "Architekt", "büro": "", "manager_startdatum": "2020-01-01"}""",
]
df = pl.DataFrame(
{
"tags": json_list,
}
).with_row_count("id", 1)
df = df.with_columns([
pl.col('tags').str.json_path_match(r"$.name").alias('name'),
pl.col('tags').str.json_path_match(r"$.büro").alias('standort'),
pl.col('tags').str.json_path_match(r"$.manager_startdatum").alias('Manager Startdatum'),
])
In obigem Beispiel haben wir einen DataFrame mit einer Spalte namens 'tags', die JSON-Strings enthält, erstellt. Wir verwenden dann die Funktion json_path_match
, um bestimmte Werte zu extrahieren. Diese Werte werden dann den neuen Spalten ('name', 'standort', 'Manager Startdatum') in unserem DataFrame zugewiesen.
Beachten Sie, dass json_path_match
null zurückgibt, wenn ein Schlüssel nicht gefunden wird. Wir können diese Tatsache nutzen, um unseren DataFrame basierend auf dem Vorhandensein eines bestimmten Schlüssels zu filtern.
df = df.filter(pl.col('tags').str.json_path_match(r"$.manager_startdatum").is_not_null())
In der obigen Codezeile filtern wir unseren DataFrame so, dass nur Zeilen enthalten sind, in denen der Schlüssel 'manager_startdatum' im JSON-String vorhanden ist.
Lesen großer JSON-Dateien als DataFrame in Polars
Bei der Arbeit mit großen JSON-Dateien können Sie auf folgenden Fehler stoßen: "RuntimeError: BindingsError: "ComputeError(Owned("InvalidEOF"))"". Es kann mehrere Gründe für diesen Fehler geben, aber eine häufige Ursache ist, dass Polars versucht, das Schema aus den ersten 1000 Zeilen Ihrer JSON-Datei zu erschließen und dann auf ein anderes Schema in weiteren Zeilen der Datei stößt. Dies liegt in der Regel daran, dass einige Einträge zusätzliche Schlüssel haben, die in den ersten 1000 Zeilen nicht vorhanden waren.
Um mit solchen Situationen umzugehen, können wir Polars anweisen, beim Lesen der Datei ein bestimmtes Schema zu verwenden, oder Polars zum Scannen der gesamten Datei zwingen, um das Schema zu erschließen. Die letztere Option könnte mehr Zeit in Anspruch nehmen, insbesondere für große Dateien, vermeidet jedoch den "InvalidEOF"-Fehler.
df = pl.read_json("große_datei.json", infer_schema_length=None)
Durch das Festlegen von infer_schema_length
auf None
zwingt Polars dazu, die gesamte Datei zu scannen, während das Schema erschlossen wird. Diese Operation kann zeitaufwändiger sein, stellt jedoch sicher, dass Polars das Schema der gesamten Datei korrekt erkennt und potenzielle Fehler eliminiert.
Mit diesen Techniken können Sie JSON-Datenverarbeitungsaufgaben in Polars effektiv bewältigen, angefangen von der Umwandlung von JSON-Strings bis hin zur Verwaltung großer JSON-Dateien. Polars eröffnet Ihnen wirklich neue Möglichkeiten für die effiziente Datenverarbeitung.
Visualisieren Sie Ihren Polars DataFrame mit PyGWalker
PyGWalker (opens in a new tab) ist eine Open-Source-Python-Bibliothek, die Ihnen dabei helfen kann, Datenvisualisierungen aus Ihrem Polars DataFrame mühelos zu erstellen.
Sie müssen keine komplizierten Verarbeitungsschritte mehr mit Python-Code durchführen. Importieren Sie einfach Ihre Daten und ziehen Sie Variablen, um alle Arten von Datenvisualisierungen zu erstellen! Hier ist ein kurzes Demo-Video zur Veranschaulichung der Vorgehensweise:
So verwenden Sie PyGWalker in Ihrem Jupyter Notebook:
pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)
Alternativ können Sie es in Kaggle Notebook/Google Colab ausprobieren:
PyGWalker basiert auf der Unterstützung unserer Open Source Community. Vergessen Sie nicht, PyGWalker GitHub (opens in a new tab) zu überprüfen und uns einen Stern zu geben!
Häufig gestellte Fragen
Hier sind einige häufig gestellte Fragen zum Umgang mit JSON-Daten in Polars:
F: Warum muss ich JSON-Zeichenketten in Polars in ein Wörterbuch umwandeln?
A: Polars arbeitet nicht direkt mit Python-Wörterbüchern. Stattdessen verwendet es das Konzept von 'Structs'. Das Umwandeln von JSON-Zeichenketten in Structs ermöglicht Ihnen das Durchführen von Operationen basierend auf bestimmten Schlüsseln oder Werten innerhalb dieser JSON-Zeichenketten.
F: Was bewirkt der Parameter 'infer_schema_length' in der Funktion 'read_json'?
A: Der Parameter 'infer_schema_length' definiert, wie viele Zeilen Polars vom Anfang Ihrer JSON-Datei scannen soll, um das Schema zu inferieren. Wenn dies auf None
gesetzt ist, wird Polars die gesamte Datei scannen, um ein umfassendes Verständnis des Schemas zu gewährleisten, jedoch auf Kosten einer längeren Ladezeit.
F: Was passiert, wenn ein Schlüssel bei Verwendung der Funktion 'json_path_match' nicht gefunden wird?
A: Wenn die Funktion 'json_path_match' keinen Schlüssel findet, gibt sie null zurück. Dieses Verhalten kann genutzt werden, um Daten basierend auf dem Vorhandensein oder Fehlen bestimmter Schlüssel zu filtern.