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.

Múltiples retornos en una función reduce

Quiero concatenar varios dataframes.

Antes de hacer esto, tengo que llamar a otra función que toma un dataframe y devuelve un dataframe y una lista.

Por ejemplo:

def do(a):
a = sth(a)
return a, a.columns.tolist()

Quiero aplicar la función concat a cada dataframe y extender la lista de columnas devueltas para cada dataframe.

reduce(lambda y, y2: pd.concat([y,y2]), map(lambda x: do(x), [df_t,df_t2,…]))

Sin embargo, obtengo un error ya que intentó concatenar mis listas en la segunda iteración. ¿Es esto posible de resolver dentro de un reduce? ¿Hay otro enfoque que sea amigable con la memoria para resolver esto?

El objetivo es tener un dataframe concatenado y procesado y una lista de todas las columnas.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para concatenar varios dataframes y extender la lista de columnas devueltas para cada dataframe, puede utilizar la función reduce del módulo functools en Python. Sin embargo, debe modificar su función do para devolver tanto el dataframe procesado como sus nombres de columna como una tupla para poder concatenarlos correctamente.

    Aquí hay una versión modificada de su código que concatena los dataframes y extiende la lista de columnas:

    from functools import reduce
    import pandas as pd
    import numpy as np
    
    def do(a):
      a = sth(a) # reemplace sth con su función de procesamiento
      return a, a.columns.tolist()
    
    df_t = pd.DataFrame({"a": [0, 1, 2], "b": [1,2,3], "c": [9,8,7]})
    df_t2 = pd.DataFrame({"a": [0, 1, 2], "b": [np.nan,0,3], "d": [9,8,7]})
    
    # Concatenar dataframes y extender la lista de columnas
    df_list = [df_t, df_t2]  # agregar más dataframes a esta lista
    dfs, columns = reduce(lambda x, y: (pd.concat([x[0], y[0]]), x[1] + y[1]), map(lambda x: do(x), df_list))
    
    # dfs contiene el dataframe concatenado y procesado
    # columns contiene la lista de todas las columnas de todos los dataframes
    

    En este código, reduce toma una función de dos argumentos que concatena dos dataframes y extiende la lista de sus columnas. map aplica la función do a cada dataframe en df_list y devuelve una lista de tuplas, donde el primer elemento es el dataframe procesado y el segundo elemento es su lista de nombres de columna. Luego, reduce aplica la función de dos argumentos a cada par de tuplas para concatenar los dataframes y extender la lista de columnas. Finalmente, dfs contiene el dataframe concatenado y procesado y columns contiene la lista de todas las columnas de todos los dataframes.

Comments are closed.