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.

Combinar una lista de dataframes de pandas CON diferentes nombres de columna cada vez.

Tengo una lista de marcos de datos con sus respectivos nombres de columna para unir, por ejemplo:

dfs = [df1, df2, df3, df4]

col_join = [“col1”, “col2”, “col3”]

He visto respuestas usando la función reduce en Python.

import pandas as pd
from functools import reduce
reduce(lambda x, y: pd.merge(x, y, on=[“Col1″], how=”outer”), dfs)

Lo que quiero lograr es lo siguiente:

Columnas df1:

Data1 Dim1 Dim2 Dim3

Columnas df2:

Example1 Example2 Example3

Columnas df3:

Other1 Other2 Other3

df1 a df2 se une por Dim1 a Example1. df1 a df3 se une por Dim2 a Other1. Esta lista va hasta df(n) donde n puede ser incluso 20 marcos de datos que se unen a df1 en diferentes nombres de columna.

Mi idea es pasar una función con la lista del df1 original y el resto df2, df3, df4 … dfn.

Otro argumento es la lista de columnas de combinación, como arriba, por ejemplo: left_on=[“Dim1”], right_on=[“Example1”].

A continuación, se uniría df1 (ya incluyendo df2 en la unión) a df3 en Dim2 y Other1.

Cada marco de datos se unirá a df1 en una columna diferente, que puede o no compartir el mismo nombre que df1, por eso left y right son argumentos que deben ser utilizados.

¿Cómo incorporar el hecho de que las columnas de combinación cambian en cada unión dentro de la función reduce?

Gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para incorporar las columnas de combinación cambiantes en cada unión dentro de la función reduce, se puede utilizar un bucle para recorrer la lista de columnas de fusión y pasarla como argumento a la función pd.merge() en cada iteración. Aquí hay un ejemplo de fragmento de código que realiza esto:

    import pandas as pd
    from functools import reduce
    
    dfs = [df1, df2, df3, df4]
    col_join = ["col1", "col2", "col3"]
    
    def unir_dataframes(df1, df2, cols):
        return pd.merge(df1, df2, left_on=cols[0], right_on=cols[1], how="outer")
    
    resultado = reduce(lambda x, y: unir_dataframes(x, y, col_join.pop(0)), dfs)
    
    

    En este código, la función unir_dataframes() toma tres argumentos: df1, df2 y cols, donde cols es una lista de dos nombres de columna para usar en la unión de df1 y df2. Dentro de la función reduce, utilizamos el método pop() para eliminar el primer elemento de la lista col_join en cada iteración y utilizarlo como argumento para la función unir_dataframes(). De esta manera, se está pasando un conjunto diferente de columnas de combinación a la función pd.merge() en cada iteración, según lo que queda en la lista col_join en ese punto.

Comments are closed.