L'opzione deprecata low_memory
L' low_memory
opzione non è adeguatamente deprecata, ma dovrebbe esserlo, poiché in realtà non fa nulla di diverso [ fonte ]
Il motivo per cui ricevi questo low_memory
avviso è perché indovinare i tipi per ogni colonna richiede molta memoria. Panda tenta di determinare quale tipo di carattere impostare analizzando i dati in ciascuna colonna.
Dtype Guessing (molto male)
I panda possono determinare quale tipo deve avere una colonna una volta letto l'intero file. Ciò significa che nulla può essere realmente analizzato prima che venga letto l'intero file a meno che non si rischi di dover modificare il tipo di quella colonna quando si legge l'ultimo valore.
Considera l'esempio di un file che ha una colonna chiamata user_id. Contiene 10 milioni di righe in cui user_id è sempre numeri. Poiché i panda non possono sapere che sono solo numeri, probabilmente lo manterranno come stringhe originali fino a quando non avrà letto l'intero file.
Specificare i tipi (dovrebbe essere sempre fatto)
aggiungendo
dtype={'user_id': int}
alla pd.read_csv()
chiamata farà sapere ai panda quando inizia a leggere il file, che questo è solo numeri interi.
Vale anche la pena notare che se l'ultima riga del file fosse stata "foobar"
scritta nella user_id
colonna, il caricamento si arresterebbe in modo anomalo se fosse specificato il tipo sopra indicato.
Esempio di dati non funzionanti che si interrompono quando vengono definiti i tipi
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'
i dtypes sono in genere una cosa insensibile, leggi di più qui:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html
Quali tipi esistono?
Abbiamo accesso ai tipi numpy: float, int, bool, timedelta64 [ns] e datetime64 [ns]. Notare che i tipi di data / ora intorpiditi non sono a conoscenza del fuso orario.
Panda estende questo set di tipi con i suoi:
'datetime64 [ns,]' Che è un timestamp consapevole del fuso orario.
'categoria' che è essenzialmente un enum (stringhe rappresentate da chiavi intere da salvare
'period []' Da non confondere con un timedelta, questi oggetti sono effettivamente ancorati a specifici periodi di tempo
'Sparse', 'Sparse [int]', 'Sparse [float]' è per dati sparsi o 'Dati che hanno molti buchi' Invece di salvare la NaN o None nel frame di dati, omette gli oggetti, risparmiando spazio .
'Intervallo' è un argomento a sé stante ma il suo uso principale è per l'indicizzazione. Vedi di più qui
'Int8', 'Int16', 'Int32', 'Int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64' sono tutti interi specifici di Panda che sono nullable, a differenza della variante numpy.
'stringa' è un dtype specifico per lavorare con i dati di stringa e dà accesso .str
all'attributo sulla serie.
"booleano" è come l'intorpidito "bool" ma supporta anche i dati mancanti.
Leggi il riferimento completo qui:
Riferimento del tipo di panda
Gotcha, avvertimenti, note
L'impostazione dtype=object
disattiverà l'avviso di cui sopra, ma non renderà la memoria più efficiente, se non altro solo efficiente.
L'impostazione dtype=unicode
non farà nulla, poiché per intorpidire, a unicode
è rappresentato come object
.
Utilizzo di convertitori
@sparrow indica correttamente l'uso dei convertitori per evitare che i panda esplodano quando si incontrano 'foobar'
in una colonna specificata come int
. Vorrei aggiungere che i convertitori sono davvero pesanti e inefficienti da usare nei panda e dovrebbero essere usati come ultima risorsa. Questo perché il processo read_csv è un singolo processo.
I file CSV possono essere elaborati riga per riga e quindi possono essere elaborati da più convertitori in parallelo in modo più efficiente semplicemente tagliando il file in segmenti ed eseguendo più processi, cosa che i panda non supportano. Ma questa è una storia diversa.