Die veraltete Low_memory-Option
Die low_memory
-Option ist nicht ordnungsgemäß veraltet, sollte es aber sein, da sie tatsächlich nichts anders macht[Quelle]
Der Grund, warum Sie diese low_memory
-Warnung erhalten, liegt darin, dass das Raten von Dtypen für jede Spalte sehr speicherintensiv ist. Pandas versucht herauszufinden, welchen Dtyp er setzen soll, indem es die Daten in jeder Spalte analysiert.
Dtyp-Raten (sehr schlecht)
Pandas kann nur bestimmen, welchen Dtyp eine Spalte haben sollte, wenn die gesamte Datei gelesen ist. Das bedeutet, dass nichts wirklich geparst werden kann, bevor die gesamte Datei gelesen ist, es sei denn, man riskiert, den Dtyp dieser Spalte ändern zu müssen, wenn man den letzten Wert liest.
Betrachten Sie das Beispiel einer Datei, in der eine Spalte namens Benutzer-ID vorhanden ist. Es enthält 10 Millionen Zeilen, wobei die Benutzer-ID immer Zahlen sind. Da Pandas nicht wissen kann, dass es nur Zahlen sind, wird es wahrscheinlich als die originalen Zeichenfolgen belassen, bis es die gesamte Datei gelesen hat.
Bestimmen von Dtypen (sollte immer gemacht werden)
hinzufügen
dtype={'user_id': int}
zu dem pd.read_csv()
-Aufruf wird Pandas wissen lassen, wenn es mit dem Lesen der Datei beginnt, dass es sich hierbei um Ganzzahlen handelt.
Es ist auch erwähnenswert, dass wenn die letzte Zeile in der Datei in der user_id
-Spalte "foobar"
geschrieben hätte, das Laden abstürzen würde, wenn der obige Dtyp angegeben wäre.
Beispiel für fehlerhafte Daten, die abstürzen, wenn Dtypen definiert sind
import pandas as pd
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
csvdaten = """user_id,benutzername
1,Alice
3,Bob
foobar,Caesar"""
sio = StringIO(csvdaten)
pd.read_csv(sio, dtype={"user_id": int, "username": "string"})
ValueError: ungültige Litarale für long() mit Basis 10: 'foobar'
Dtypen sind typischerweise eine numpy-Sache, lesen Sie hier mehr darüber: http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html
Welche Dtypen gibt es?
Wir haben Zugriff auf numpy-Dtypen: float, int, bool, timedelta64[ns] und datetime64[ns]. Beachten Sie, dass die numpy-Datum-/Uhrzeit-Dtypen nicht zeitzonenbewusst sind.
Pandas erweitert diesen Satz von Dtypen mit seinen eigenen:
'datetime64[ns, ]'
Was ein zeitzonenbewusster Zeitstempel ist.
'category', was im Wesentlichen ein Enum ist (Zeichenfolgen, die durch Ganzzahl-Schlüssel dargestellt werden, um Platz zu sparen
'period[]' Nicht zu verwechseln mit einer Zeitspanne, diese Objekte sind tatsächlich an bestimmte Zeitperioden gebunden
'Sparse', 'Sparse[int]', 'Sparse[float]' ist für spärliche Daten oder 'Daten, die viele Löcher haben' anstatt NaN oder None im DataFrame zu speichern, werden die Objekte weggelassen, um Platz zu sparen.
'Interval' ist ein eigenes Thema, aber sein Hauptzweck ist die Indizierung. Hier erfahren Sie mehr
'Int8', 'Int16', 'Int32', 'Int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64' sind alles spezifische pandas-Ganzzahlen, die nullfähig sind, im Gegensatz zur numpy-Variante.
'string' ist ein spezifischer Dtyp für die Arbeit mit String-Daten und ermöglicht den Zugriff auf das .str
-Attribut der Serie.
'boolean' ist wie das numpy 'bool', unterstützt aber auch fehlende Daten.
Lesen Sie die vollständige Referenz hier:
Pandas-Dtypen-Referenz
Fallen, Einschränkungen, Hinweise
Das Setzen von dtype=object
wird die obige Warnung zum Schweigen bringen, macht es aber nicht speicher effizienter, nur prozesseffizienter, wenn überhaupt.
Das Setzen von dtype=unicode
wird nichts bewirken, da für numpy ein unicode
als object
dargestellt wird.
Verwendung von Konvertern
@sparrow weist korrekterweise auf die Verwendung von Konvertern hin, um zu vermeiden, dass Pandas beim Auftreten von 'foobar'
in einer als int
angegebenen Spalte abstürzt. Ich möchte hinzufügen, dass Konverter wirklich schwerfällig und ineffizient in Pandas sind und als letztes Mittel verwendet werden sollten. Das liegt daran, dass der read_csv-Prozess ein einzelner Prozess ist.
CSV-Dateien können zeilenweise verarbeitet werden und können daher effizienter von mehreren Konvertern parallel verarbeitet werden, indem die Datei einfach in Segmente aufgeteilt und mehrere Prozesse ausgeführt werden, etwas, das von Pandas nicht unterstützt wird. Aber das ist eine andere Geschichte.