tutorial tablas seleccionar para notebook leer graficar funciones español documentacion datos con columnas python csv pandas dataframe bigdata

tablas - python: uso de estructuras de pandas con csv grande(iterar y tamaño de fragmento)



seleccionar columnas en pandas (3)

Tengo un archivo csv grande, de unos 600 MB con 11 millones de filas y quiero crear datos estadísticos como pivotes, histogramas, gráficos, etc. Obviamente, solo intento leerlo normalmente:

df = pd.read_csv(''Check400_900.csv'', sep=''/t'')

no funciona, así que encontré iterate y chunksize en una publicación similar, así que usé

df = pd.read_csv(''Check1_900.csv'', sep=''/t'', iterator=True, chunksize=1000)

Todo bien, por ejemplo, puedo print df.get_chunk(5) y buscar todo el archivo con solo

for chunk in df: print chunk

Mi problema es que no sé cómo usar cosas como estas a continuación para todo el df y no solo para un fragmento

plt.plot() print df.head() print df.describe() print df.dtypes customer_group3 = df.groupby(''UserID'') y3 = customer_group.size()

Espero que mi pregunta no sea tan confusa.


Necesitas concatenar los mandriles. Por ejemplo:

df2 = pd.concat([chunk for chunk in df])

Y luego ejecuta tus comandos en df2


No necesitas concat aquí. Es exactamente como escribir sum(map(list, grouper(tup, 1000))) lugar de list(tup) . Lo único que hace chunksize=1000 y chunksize=1000 es darle un objeto de lector que itera DataFrames de 1000 filas en lugar de leer todo. Si quieres todo al mismo tiempo, simplemente no uses esos parámetros.

Pero si leer todo el archivo en la memoria a la vez es demasiado costoso (por ejemplo, toma tanta memoria que obtienes un MemoryError , o ralentizas tu sistema arrastrándolo al infierno de intercambio), eso es exactamente para lo que es chunksize .

El problema es que nombró el iterador resultante df y luego trató de usarlo como un DataFrame. No es un DataFrame; Es un iterador que le proporciona marcos de datos de 1000 filas uno por uno.

Cuando dices esto:

Mi problema es que no sé cómo usar cosas como estas a continuación para todo el df y no solo para un fragmento

La respuesta es que no puedes . Si no puede cargar todo en un DataFrame gigante, no puede usar un DataFrame gigante. Tienes que reescribir tu código alrededor de fragmentos.

En lugar de esto:

df = pd.read_csv(''Check1_900.csv'', sep=''/t'', iterator=True, chunksize=1000) print df.dtypes customer_group3 = df.groupby(''UserID'')

... tienes que hacer cosas como esta:

for df in pd.read_csv(''Check1_900.csv'', sep=''/t'', iterator=True, chunksize=1000): print df.dtypes customer_group3 = df.groupby(''UserID'')

A menudo, lo que necesita hacer es agregar algunos datos: reduzca cada fragmento a algo mucho más pequeño con solo las partes que necesita. Por ejemplo, si desea sumar el archivo completo por grupos, puede groupby cada fragmento, luego sumar el fragmento por grupos y almacenar una serie / matriz / lista / resumen de totales acumulados para cada grupo.

Por supuesto, es un poco más complicado que simplemente sumar una serie gigante de una vez, pero no hay forma de evitarlo . (Excepto para comprar más RAM y / o cambiar a 64 bits). Así es como el iterator y el chunksize resuelven el problema: permitiéndole hacer esta compensación cuando sea necesario.


Solución, si es necesario, cree un gran DataFrame si es necesario procesa todos los datos a la vez (lo que es posible, pero no se recommended ):

Luego use concat para todos los fragmentos a df, porque tipo de salida de función:

df = pd.read_csv(''Check1_900.csv'', sep=''/t'', iterator=True, chunksize=1000)

no es dataframe, sino pandas.io.parsers.TextFileReader - source .

tp = pd.read_csv(''Check1_900.csv'', sep=''/t'', iterator=True, chunksize=1000) print tp #<pandas.io.parsers.TextFileReader object at 0x00000000150E0048> df = pd.concat(tp, ignore_index=True)

Creo que es necesario agregar el parámetro ignorar el índice a la función concat , porque se evita la duplicidad de índices.

EDITAR:

Pero si desea trabajar con datos grandes como la agregación, mucho mejor es usar dask , ya que proporciona un paralelismo avanzado.