Die veraltete Option low_memory
Die low_memory
Option ist nicht richtig veraltet, sollte es aber sein, da sie eigentlich nichts anderes macht [ Quelle ]
Der Grund, warum Sie diese low_memory
Warnung erhalten, ist, dass das Erraten von dtypes für jede Spalte sehr speicherintensiv ist. Pandas versucht zu bestimmen, welcher D-Typ festgelegt werden soll, indem die Daten in jeder Spalte analysiert werden.
Dtype Guessing (sehr schlecht)
Pandas können erst bestimmen, welchen Typ eine Spalte haben soll, wenn die gesamte Datei gelesen wurde. Dies bedeutet, dass vor dem Lesen der gesamten Datei nichts wirklich analysiert werden kann, es sei denn, Sie riskieren, den d-Typ dieser Spalte beim Lesen des letzten Werts ändern zu müssen.
Betrachten Sie das Beispiel einer Datei mit einer Spalte namens user_id. Es enthält 10 Millionen Zeilen, in denen die Benutzer-ID immer aus Zahlen besteht. Da Pandas nicht wissen können, dass es sich nur um Zahlen handelt, werden sie wahrscheinlich als Originalzeichenfolgen beibehalten, bis die gesamte Datei gelesen wurde.
Angabe von dtypes (sollte immer erfolgen)
Hinzufügen
dtype={'user_id': int}
Bei dem pd.read_csv()
Aufruf werden Pandas wissen, wenn sie mit dem Lesen der Datei beginnen, dass dies nur Ganzzahlen sind.
Erwähnenswert ist auch, dass das Laden abstürzen würde , wenn die letzte Zeile in der Datei "foobar"
in die user_id
Spalte geschrieben worden wäre, wenn der obige dtype angegeben worden wäre.
Beispiel für fehlerhafte Daten, die beim Definieren von dtypes beschädigt werden
import pandas as pd
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
csvdata = """user_id,username
1,Alice
3,Bob
foobar,Caesar"""
sio = StringIO(csvdata)
pd.read_csv(sio, dtype={"user_id": int, "username": "string"})
ValueError: invalid literal for long() with base 10: 'foobar'
dtypes sind normalerweise eine numpy Sache, lesen Sie mehr darüber hier:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html
Welche dtypes gibt es?
Wir haben Zugriff auf numpy dtypes: float, int, bool, timedelta64 [ns] und datetime64 [ns]. Beachten Sie, dass die numpy Datum / Uhrzeit dtypes ist nicht bekannt , Zeitzone.
Pandas erweitert diesen Satz von dtypes um seine eigenen:
'datetime64 [ns,]' Dies ist ein zeitzonenabhängiger Zeitstempel.
'Kategorie', die im Wesentlichen eine Aufzählung ist (Zeichenfolgen, die durch zu speichernde Ganzzahlschlüssel dargestellt werden
'period []' Nicht zu verwechseln mit einem Zeitdelta, diese Objekte sind tatsächlich in bestimmten Zeiträumen verankert
'Sparse', 'Sparse [int]', 'Sparse [float]' steht für spärliche Daten oder 'Daten mit vielen Löchern'. Anstatt das NaN oder None im Datenrahmen zu speichern, werden die Objekte weggelassen, wodurch Platz gespart wird .
'Intervall' ist ein eigenes Thema, das hauptsächlich zur Indizierung verwendet wird. Sehen Sie hier mehr
'Int8', 'Int16', 'Int32', 'Int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64' sind alles Pandas-spezifische Ganzzahlen, die im Gegensatz zur Numpy-Variante nullbar sind.
'string' ist ein spezifischer dtype für die Arbeit mit String-Daten und ermöglicht den Zugriff auf das .str
Attribut in der Serie.
'boolean' ist wie das numpy 'bool', unterstützt aber auch fehlende Daten.
Lesen Sie hier die vollständige Referenz:
Pandas dtype Referenz
Fallstricke, Vorbehalte, Notizen
Durch die Einstellung dtype=object
wird die obige Warnung stummgeschaltet, aber nicht speichereffizienter, sondern nur prozesseffizienter, wenn überhaupt.
Die Einstellung dtype=unicode
bewirkt nichts, da a für numpy unicode
als dargestellt wird object
.
Verwendung von Konvertern
@sparrow weist korrekt auf die Verwendung von Konvertern hin, um zu vermeiden, dass Pandas explodieren, wenn sie 'foobar'
in einer Spalte auftreten, die als angegeben ist int
. Ich möchte hinzufügen, dass Konverter sehr schwer und ineffizient in Pandas zu verwenden sind und als letztes Mittel verwendet werden sollten. Dies liegt daran, dass der Prozess read_csv ein einzelner Prozess ist.
CSV-Dateien können zeilenweise verarbeitet werden und somit von mehreren Konvertern parallel effizienter verarbeitet werden, indem die Datei einfach in Segmente geschnitten und mehrere Prozesse ausgeführt werden, was Pandas nicht unterstützt. Aber das ist eine andere Geschichte.