Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

161
Vistas
Inicialización de la serie Slow Pandas de la lista de DataFrames

Descubrí que es extremadamente lento si inicializamos un objeto de la serie pandas de una lista de marcos de datos. Por ejemplo, el siguiente código:

 import pandas as pd import numpy as np # creating a large (~8GB) list of DataFrames. l = [pd.DataFrame(np.zeros((1000, 1000))) for i in range(1000)] # This line executes extremely slow and takes almost extra ~10GB memory. Why? # It is even much, much slower than the original list `l` construction. s = pd.Series(l)

Inicialmente, pensé que la inicialización de la Serie accidentalmente copió en profundidad los DataFrames, lo que lo hace lento, pero resultó que solo se copia por referencia como lo hace = habitual en python.

Por otro lado, si solo creo una serie y copio manualmente los elementos (en un bucle for), será rápido:

 # This for loop is faster. Why? s1 = pd.Series(data=None, index=range(1000), dtype=object) for i in range(1000): s1[i] = l[i]

¿Que está sucediendo aquí?

Uso en la vida real: tengo un cargador de tablas que lee algo en el disco y devuelve un marco de datos de pandas (una tabla). Para acelerar la lectura, uso una herramienta paralela (de esta respuesta ) para ejecutar varias lecturas (cada lectura es para una fecha, por ejemplo), y devuelve una lista (de tablas). Ahora quiero transformar esta lista en un objeto de la serie pandas con un índice adecuado (por ejemplo, la fecha o la ubicación del archivo utilizada en la lectura), pero la construcción de la serie lleva una cantidad de tiempo ridícula (como se muestra en el código de muestra anterior). Por supuesto, puedo escribirlo como un ciclo for para resolver el problema, pero eso será feo. Además quiero saber lo que realmente está tomando el tiempo aquí. ¿Alguna idea?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Esta no es una respuesta directa a la pregunta del OP (qué está causando la desaceleración al construir una serie a partir de una lista de marcos de datos):

Es posible que me esté perdiendo una ventaja importante de usar pd.Series para almacenar una lista de marcos de datos; sin embargo, si eso no es crítico para los procesos posteriores, entonces una mejor opción podría ser almacenar esto como un diccionario de marcos de datos o concatenar en un solo marco de datos .

Para el diccionario de marcos de datos, se podría usar algo como:

 d = {n: df for n, df in enumerate(l)} # can change the key to something more useful in downstream processes

Para la concatenación:

 w = pd.concat(l, axis=1) # note that when using with the snippet in this question # the column names will be duplicated (because they have # the same names) but if your actual list of dataframes # contains unique column names, then the concatenated # dataframe will act as a normal dataframe with unique # column names
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda