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.