Saltar al contenido

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

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 concatporque evita la duplicidad de índices.

EDITAR:

Pero si quiere trabajar con grandes datos como la agregación, mucho mejor es usar daskporque 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 MemoryErroro 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *