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.
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 utilizarreduce
ymerge
. La funciónconcat
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ámetroaxis=1
para concatenar los marcos de datos a lo largo de las columnas (es decir, horizontalmente).A continuación, necesitamos ordenar el marco de datos resultante por fecha. La función
sort_values
puede hacer esto por nosotros.Finalmente, necesitamos rellenar los valores faltantes con
NaN
. La funciónfillna
puede hacer esto por nosotros.Con estas modificaciones, el código final debería verse algo así:
Esto nos dará el marco de datos resultante deseado.