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.

Fusiona una lista de dataframes por una columna con la función reduce

He editado esta publicación con el caso específico:

Tengo una lista de dataframes como este (ten en cuenta que df1 y df2 tienen una fila en común)

df1

index fecha A
0 2010-06-19 4
1 2010-06-20 3
2 2010-06-21 2
3 2010-06-22 1
4 2012-07-19 5

df2

index fecha B
0 2012-07-19 5
1 2012-07-20 6

df3

index fecha C
0 2020-06-19 5
1 2020-06-20 2
2 2020-06-21 9

df_list = [df1, df2, df3]

Me gustaría combinar todos los dataframes en un solo dataframe, sin perder filas y colocando NaN donde no hay cosas que combinar. El criterio sería combinarlos por la columna ‘fecha’ (la columna debería tener todas las fechas de todos los dataframes combinados, ordenadas por fecha).

El dataframe resultante debería verse así:

Dataframe resultante:

index fecha A B C
0 2010-06-19 4 NaN NaN
1 2010-06-20 3 NaN NaN
2 2010-06-21 2 NaN NaN
3 2010-06-22 1 NaN NaN
4 2012-07-19 5 5 NaN
5 2012-07-20 NaN 6 NaN
6 2020-06-19 NaN NaN 5
7 2020-06-20 NaN NaN 2
8 2020-06-21 NaN NaN 9

He intentado algo como esto:

from functools import reduce

df_merged = reduce(lambda left,right: pd.merge(left,right,on=['fecha'], how='outer'), df_list)

PERO el dataframe resultante no es el esperado (me faltan algunas columnas y no está ordenado por fecha). Creo que me falta algo.

Muchas gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, necesitamos realizar algunos pasos adicionales después de fusionar los marcos de datos.

    Primero, podemos concatenar los marcos de datos utilizando la función concat en lugar de utilizar reduce y merge. La función concat concatena los marcos de datos a lo largo de un eje particular, preservando todas las filas y columnas en cada marco de datos. Utilizaremos el parámetro axis=1 para concatenar los marcos de datos a lo largo de las columnas (es decir, horizontalmente).

    df_merged = pd.concat(df_list, axis=1)
    

    A continuación, necesitamos ordenar el marco de datos resultante por fecha. La función sort_values puede hacer esto por nosotros.

    df_merged = df_merged.sort_values(by=['Date'])
    

    Finalmente, necesitamos rellenar los valores faltantes con NaN. La función fillna puede hacer esto por nosotros.

    df_merged = df_merged.fillna(value=np.nan)
    

    Con estas modificaciones, el código final debería verse algo así:

    import numpy as np
    import pandas as pd
    
    df_list = [df1, df2, df3]
    
    df_merged = pd.concat(df_list, axis=1)
    df_merged = df_merged.sort_values(by=['Date'])
    df_merged = df_merged.fillna(value=np.nan)
    

    Esto nos dará el marco de datos resultante deseado.

Comments are closed.