¿Cómo leo un archivo csv grande con pandas?
Estoy intentando leer un archivo csv grande (aproximadamente 6 GB) en pandas y aparece un error de memoria:
MemoryError Traceback (most recent call last)
<ipython-input-58-67a72687871b> in <module>()
----> 1 data=pd.read_csv('aphro.csv',sep=';')
...
MemoryError:
¿Alguna ayuda con esto?
El error muestra que la máquina no tiene suficiente memoria para leer el CSV completo en un DataFrame a la vez. Suponiendo que no necesita todo el conjunto de datos en la memoria al mismo tiempo, una forma de evitar el problema sería procesar el CSV en fragmentos (especificando el chunksize
parámetro):
chunksize = 10 ** 6
for chunk in pd.read_csv(filename, chunksize=chunksize):
# chunk is a DataFrame. To "process" the rows in the chunk:
for index, row in chunk.iterrows():
print(row)
El chunksize
parámetro especifica el número de filas por fragmento. (El último fragmento puede contener menos de chunksize
filas, por supuesto).
pandas >= 1.2
read_csv
with chunksize
devuelve un administrador de contexto, que se usará así:
chunksize = 10 ** 6
with pd.read_csv(filename, chunksize=chunksize) as reader:
for chunk in reader:
process(chunk)
Ver GH38225
La fragmentación no siempre debería ser la primera opción para este problema.
¿El archivo es grande debido a datos no numéricos repetidos o columnas no deseadas?
Si es así, a veces puede ver ahorros masivos de memoria leyendo columnas como categorías y seleccionando las columnas requeridas mediante el parámetro pd.read_csv
usecols
.¿Su flujo de trabajo requiere cortar, manipular o exportar?
Si es así, puede utilizar dask.dataframe para dividir, realizar cálculos y exportar de forma iterativa. La fragmentación la realiza dask de forma silenciosa, que también admite un subconjunto de API de pandas.
Si todo lo demás falla, lea línea por línea mediante fragmentos.
Chunk a través de pandas o mediante la biblioteca csv como último recurso.