tutorial read_csv read into index functions example python parsing numpy pandas dataframe

python - into - Pandas read_csv low_memory y opciones de tipo



python pandas read csv example (5)

La opción obsoleta low_memory

La opción low_memory no está en desuso, pero debería ser así, ya que en realidad no hace nada diferente [ source ]

La razón por la que recibes esta advertencia de low_memory es porque adivinar dtypes para cada columna es muy exigente con la memoria. Pandas intenta determinar qué tipo de definición establecer al analizar los datos en cada columna.

Dtype Guessing (muy malo)

Los pandas solo pueden determinar qué tipo de letra debe tener una columna una vez que se lee el archivo completo. Esto significa que no se puede analizar nada 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 es siempre números. Como los pandas no pueden saber que solo son números, probablemente lo mantendrán como las cadenas originales hasta que haya leído todo el archivo.

Especificar dtypes (siempre debe hacerse)

agregando

dtype={''user_id'': int}

a la llamada pd.read_csv() hará saber a los pandas cuando comience a leer el archivo, que esto solo es un número entero.

También vale la pena señalar que si la última línea del archivo tuviera "foobar" escrito en la columna user_id , la carga se bloquearía si se especificaba el tipo de letra anterior.

Ejemplo de datos rotos que se rompen cuando se definen los dtypes

import pandas as pd from StringIO import StringIO csvdata = """user_id,username 1,Alice 3,Bob foobar,Caesar""" sio = StringIO(csvdata) pd.read_csv(sio, dtype={"user_id": int, "username": object}) ValueError: invalid literal for long() with base 10: ''foobar''

los dictámenes suelen ser algo nude, lea más sobre ellos aquí: http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html

Gotchas, advertencias, notas

Establecer dtype=object silenciará la advertencia anterior, pero no hará que sea más eficiente desde el punto de vista de la memoria, solo procesará eficientemente en cualquier caso.

Establecer dtype=unicode no hará nada, ya que para numpy, un unicode se representa como un object .

Uso de convertidores

@sparrow señala correctamente el uso de los convertidores para evitar que los pandas exploten al encontrar ''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 se pueden procesar 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.

Cuando llamas

df = pd.read_csv(''somefile.csv'')

Yo obtengo:

/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/io/parsers.py:1130: DtypeWarning: Columns (4,5,7,16) tienen tipos mixtos. Especifique la opción dtype en importar o configure low_memory = False.

¿Por qué la opción de tipo está relacionada con low_memory , y por qué sería False ayuda con este problema?


Como se mencionó anteriormente por firelynx si dtype está explícitamente especificado y hay datos mixtos que no son compatibles con ese tipo de d, la carga se bloqueará. Utilicé un convertidor de este tipo como una solución alternativa para cambiar los valores con un tipo de datos incompatible para que los datos aún pudieran cargarse.

def conv(val): if not val: return 0 try: return np.float64(val) except: return np.float64(0) df = pd.read_csv(csv_file,converters={''COL_A'':conv,''COL_B'':conv})


Tratar:

dashboard_df = pd.read_csv(p_file, sep='','', error_bad_lines=False, index_col=False, dtype=''unicode'')

De acuerdo con la documentación de los pandas:

dtype: escriba el nombre o el dict de la columna -> escriba

En cuanto a low_memory, es True por defecto y aún no está documentado. No creo que sea relevante sin embargo. 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


Tuve un problema similar con un archivo ~ 400MB. Establecer low_memory = False hizo el truco para mí. Haga las cosas simples primero, verificaría que su dataframe no sea más grande que la memoria de su sistema, reinicie, borre la RAM antes de continuar. Si todavía tiene errores, vale la pena asegurarse de que su archivo .csv esté bien, eche un vistazo rápido en Excel y asegúrese de que no haya corrupción evidente. Los datos originales rotos pueden causar estragos ...


df = pd.read_csv(''somefile.csv'', low_memory=False)

Esto debería resolver el problema. Obtuve exactamente el mismo error al leer filas de 1.8M desde un archivo CSV.