La opción obsoleta low_memory
La low_memory
opción no está desaprobada correctamente, pero debería serlo, ya que en realidad no hace nada diferente [ fuente ]
La razón por la que recibe esta low_memory
advertencia es porque adivinar los tipos de letra para cada columna requiere mucha memoria. Pandas intenta determinar qué dtype establecer mediante el análisis de los datos en cada columna.
Dtype Guessing (muy mal)
Los pandas solo pueden determinar qué tipo de columna debe tener una columna una vez que se lee todo el archivo. Esto significa que nada se puede analizar antes de leer todo el archivo a menos que corra el riesgo de tener que cambiar el tipo de esa columna cuando lea el último valor.
Considere el ejemplo de un archivo que tiene una columna llamada user_id. Contiene 10 millones de filas donde user_id siempre son números. Dado que los pandas no pueden saber que son solo números, probablemente lo mantendrá como las cadenas originales hasta que haya leído todo el archivo.
Especificar dtypes (siempre se debe hacer)
agregando
dtype={'user_id': int}
la pd.read_csv()
llamada hará que los pandas sepan cuando comienza a leer el archivo, que esto es solo números enteros.
También vale la pena señalar que si la última línea del archivo se hubiera "foobar"
escrito en la user_id
columna, la carga se bloquearía si se especificara el dtype anterior.
Ejemplo de datos rotos que se rompen cuando se definen los tipos
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'
Los dtypes suelen ser algo complicado, lea más sobre ellos aquí:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html
¿Qué tipos existen?
Tenemos acceso a tipos de numpy: float, int, bool, timedelta64 [ns] y datetime64 [ns]. Tenga en cuenta que los tipos de fecha / hora numpy no son conscientes de la zona horaria.
Pandas extiende este conjunto de dtypes con los suyos:
'datetime64 [ns,]' Que es una marca de tiempo que reconoce la zona horaria.
'categoría' que es esencialmente una enumeración (cadenas representadas por teclas enteras para guardar
'period []' No debe confundirse con un timedelta, estos objetos están realmente anclados a períodos de tiempo específicos
'Sparse', 'Sparse [int]', 'Sparse [float]' es para datos dispersos o 'Datos que tienen muchos agujeros'. En lugar de guardar el NaN o Ninguno en el marco de datos, omite los objetos, ahorrando espacio .
'Intervalo' es un tema en sí mismo, pero su uso principal es para indexar. Ver más aquí
'Int8', 'Int16', 'Int32', 'Int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64' son todos enteros específicos de pandas que son anulables, a diferencia de la variante numpy.
'string' es un dtype específico para trabajar con datos de cadena y da acceso al .str
atributo en la serie.
'boolean' es como el 'bool' numpy pero también admite datos faltantes.
Lea la referencia completa aquí:
Referencia dtype de pandas
Gotchas, advertencias, notas
La configuración dtype=object
silenciará la advertencia anterior, pero no hará que sea más eficiente en cuanto a memoria, solo procesará eficientemente en todo caso.
La configuración dtype=unicode
no hará nada, ya que a numpy, a unicode
se representa como object
.
Uso de convertidores
@sparrow señala correctamente el uso de convertidores para evitar que los pandas exploten cuando se encuentran 'foobar'
en una columna especificada como int
. Me gustaría agregar que los convertidores son realmente pesados e ineficientes para usar en pandas y deberían usarse como último recurso. Esto se debe a que el proceso read_csv es un proceso único.
Los archivos CSV pueden procesarse línea por línea y, por lo tanto, pueden ser procesados por múltiples convertidores en paralelo de manera más eficiente simplemente cortando el archivo en segmentos y ejecutando múltiples procesos, algo que los pandas no admiten. Pero esta es una historia diferente.