Después de de esta larga compilación de información hemos podido resolver esta aprieto que presentan ciertos usuarios. Te ofrecemos la solución y nuestro deseo es resultarte de gran apoyo.
Solución:
Solución, si es necesario crear uno grande DataFrame
si necesita procesar todos los datos a la vez (lo que es posible, pero no recomendado):
Luego use concat para todos los fragmentos a df, porque el tipo de salida de la función:
df = pd.read_csv('Check1_900.csv', sep='t', iterator=True, chunksize=1000)
no es marco de datos, pero pandas.io.parsers.TextFileReader
– fuente.
tp = pd.read_csv('Check1_900.csv', sep='t', iterator=True, chunksize=1000)
print tp
#
df = pd.concat(tp, ignore_index=True)
Creo que es necesario agregar el parámetro ignorar el índice para funcionar concat
porque evita la duplicidad de índices.
EDITAR:
Pero si quiere trabajar con grandes datos como la agregación, mucho mejor es usar dask
porque proporciona un paralelismo avanzado.
Tú haces no necesidad concat
aquí. Es exactamente como escribir. sum(map(list, grouper(tup, 1000)))
en vez de list(tup)
. La única cosa iterator
y chunksize=1000
lo que hace es darle un objeto lector que itera DataFrames de 1000 filas en lugar de leer todo. Si quiere todo de una vez, simplemente no use esos parámetros.
Pero si leer todo el archivo en la memoria a la vez es demasiado costoso (por ejemplo, ocupa tanta memoria que obtiene un MemoryError
o ralentizar su sistema arrojándolo al infierno de intercambio), eso es exactamente lo que chunksize
es para.
El problema es que nombraste al iterador resultante df
, y luego trató de usarlo como DataFrame. No es un marco de datos; es un iterador que le brinda 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 una parte
la respuesta es que tu no puedo. Si no puede cargar todo en un DataFrame gigante, no puede usar un DataFrame gigante. Tienes que reescribir tu código alrededor de trozos.
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 debe hacer es agregar algunos datos: reducir cada parte a algo mucho más pequeño con solo las partes que necesita. Por ejemplo, si desea sumar todo el archivo por grupos, puede groupby
cada fragmento, luego sume el fragmento por grupos y almacene una serie/array/list/dict de los totales acumulados de cada grupo.
Por supuesto, es un poco más complicado que simplemente sumar una serie gigante de una sola vez, pero no hay forma de evitar eso. (Excepto para comprar más RAM y/o cambiar a 64 bits). Así es como iterator
y chunksize
resolver el problema: al permitirle hacer este intercambio cuando lo necesite.
Necesitas concatenar los mandriles. Por ejemplo:
df2 = pd.concat([chunk for chunk in df])
Y luego ejecute sus comandos en df2
Aquí tienes las reseñas y valoraciones
Puedes secundar nuestra misión mostrando un comentario o dejando una valoración te estamos eternamente agradecidos.