Cuando llame
df = pd.read_csv('somefile.csv')
Yo obtengo:
/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/io/parsers.py:1130: DtypeWarning: Las columnas (4,5,7,16) tienen tipos mixtos. Especifique la opción dtype al importar o establezca low_memory = False.
¿Por qué está dtype
relacionada la opción low_memory
y por qué False
ayudarla con este problema?
Respuestas:
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
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 lauser_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
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, aunicode
se representa comoobject
.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 comoint
. 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.
fuente
dtype=object
no es más eficiente con la memoria, ¿hay alguna razón para meterse con ella además de deshacerse del error?error_bad_lines=False, warn_bad_lines=True
debería hacer el truco. La documentación dice que solo es válido con el analizador C. También dice que el analizador predeterminado es Ninguno, lo que dificulta saber cuál es el predeterminado.nrows=100
como argumento y luegodf.dtypes
ver los tipos de letra que obtiene. Sin embargo, cuando lea todo el marco de datos con estos tipos de d, asegúrese de hacer unatry/except
para que adivine las suposiciones de dtype defectuosas. Los datos están sucios, ya sabes.Tratar:
De acuerdo con la documentación de los pandas:
En cuanto a low_memory, es True por defecto y aún no está documentado. Sin embargo, no creo que sea relevante. El mensaje de error es genérico, por lo que no debería tener que meterse con low_memory de todos modos. Espero que esto ayude y avíseme si tiene más problemas.
fuente
dtype=unicode
Producción:NameError: name 'unicode' is not defined
. ¡Pero ponerunicode
comillas (como en 'unicode') parece funcionar!numpy.dtype('unicode')
. Cuando asigna una cadena a la opción dtype, intentará emitirla denumpy.dtype()
fábrica de manera predeterminada. Especificar en'unicode'
realidad no hará nada, solo se incluyen los Unicodesobjects
. Obtendrádtype='object'
Esto debería resolver el problema. Obtuve exactamente el mismo error al leer 1.8M filas de un CSV.
fuente
Como se mencionó anteriormente por firelynx si dtype se especifica explícitamente y hay datos mixtos que no son compatibles con ese dtype, la carga se bloqueará. Utilicé un convertidor como este como solución alternativa para cambiar los valores con un tipo de datos incompatible para que los datos aún pudieran cargarse.
fuente
Tuve un problema similar con un archivo de ~ 400 MB. Configuración
low_memory=False
hizo el truco para mí. Primero haga las cosas simples, verificaría que su marco de datos no sea más grande que la memoria de su sistema, reinicie, borre la RAM antes de continuar. Si aún se encuentra con errores, vale la pena asegurarse de que su.csv
archivo esté bien, eche un vistazo rápido en Excel y asegúrese de que no haya corrupción obvia. Los datos originales rotos pueden causar estragos ...fuente
Estaba enfrentando un problema similar al procesar un gran archivo csv (6 millones de filas). Tuve tres problemas: 1. el archivo contenía caracteres extraños (arreglado usando codificación) 2. el tipo de datos no se especificó (arreglado usando la propiedad dtype) 3. Usando lo anterior, todavía enfrenté un problema relacionado con el formato de archivo que no podía ser definido en base al nombre de archivo (corregido usando try .. excepto ..)
fuente
Me funcionó
low_memory = False
mientras importaba un DataFrame. Ese es todo el cambio que funcionó para mí:fuente