es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Fuga de memoria en Python DataFrame al usar el método “at”.

Estoy iterando sobre un DataFrame de Python.

para índice, fila en df.iterrows():

if condición:
df.at[indice, ‘col’] = nuevoValor

y cada vez que se ejecuta df.at, mi memoria aumenta un poco.

Estoy iterando sobre un DataFrame de un millón de filas, por lo que la máquina se queda sin memoria y se bloquea.

Algunas observaciones:
– Si no actualizo el df, la memoria no aumenta, por lo que la fuga de memoria se debe a la actualización utilizando el método at
– He intentado dividir el df en varios fragmentos y llamar a gc.collect() después de cada fragmento, o intentar del df_fragmento_i luego gc.collect(), pero la memoria no se libera
– He visto algunas otras preguntas de SO algo relacionadas que proponen hacer inplace=True, pero no puedo ver que sea aplicable aquí

¿Hay alguna alternativa que evite la fuga de memoria?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, en lugar de actualizar el DataFrame usando el método .at, puedes usar el método .loc, que permite modificar directamente el dataframe sin crear una copia. Aquí tienes un ejemplo de código:

    for index, row in df.iterrows():
        ...
        if condition:
            df.loc[index, 'col'] = newValue
    

    También puedes intentar usar una lista para almacenar las filas modificadas y luego actualizar el DataFrame de una sola vez usando .loc:

    rows_to_update = []
    for index, row in df.iterrows():
        ...
        if condition:
            rows_to_update.append(index)
    
    df.loc[rows_to_update, 'col'] = newValue
    

    El uso de cualquiera de estas alternativas debería evitar la fuga de memoria causada por el uso de df.at.

Comments are closed.