Python 组合多个具有互补缺失值的数据帧的最有效方法

Python 组合多个具有互补缺失值的数据帧的最有效方法,python,pandas,dataframe,Python,Pandas,Dataframe,这可能是一个相当基本的问题。假设我有两个数据帧: >>> df1 id a 0 0 5.0 1 1 10.0 2 2 15.0 3 3 NaN 4 4 NaN 5 5 NaN >>> df2 id a 0 0 NaN 1 1 NaN 2 2 NaN 3 3 20.0 4 4 25.0 5 5 30.0 我想加入id上的数据帧,使其看起来像:

这可能是一个相当基本的问题。假设我有两个数据帧:

>>> df1
   id     a
0   0   5.0
1   1  10.0
2   2  15.0
3   3   NaN
4   4   NaN
5   5   NaN

>>> df2
   id     a
0   0   NaN
1   1   NaN
2   2   NaN
3   3  20.0
4   4  25.0
5   5  30.0


我想加入
id
上的数据帧,使其看起来像:

>>> df_joined
   id     a
0   0   5.0
1   1  10.0
2   2  15.0
3   3  20.0
4   4  25.0
5   5  30.0
到目前为止,我一直在做左合并,例如
df1.merge(df2,how='left',on='id)
,但这会导致重复的列(见下文),我必须通过填充NAN、重命名列,然后删除重复的列来纠正。如果要合并的数据帧超过2个,这将变得特别乏味

# How do I better merge this so I don't have fill nans, rename, and drop the columns?
   id   a_x   a_y
0   0   5.0   NaN
1   1  10.0   NaN
2   2  15.0   NaN
3   3   NaN  20.0
4   4   NaN  25.0
5   5   NaN  30.0
有什么更好的方法吗?

IIUC

编辑

我们可以将+与
map
reduce
一起用于n数据帧

my_list_df = [df1, df2]

from functools import reduce
reduce(lambda new_df,  df_to_combine: new_df.combine_first(df_to_combine), 
       map(lambda df: df.set_index('id'), my_list_df)).reset_index()
输出

   id     a
0   0   5.0
1   1  10.0
2   2  15.0
3   3  20.0
4   4  25.0
5   5  30.0
在这种情况下,我们只需要
减少

reduce(lambda new_df, df_to_combine: new_df.combine_first(df_to_combine.set_index('id')),
       my_list_df[1:], my_list_df[0].set_index('id')).reset_index()

我认为,
combine\u first
是基于位置的,但是前面提到的OP是基于列
id
来填充列a的,在这里它起作用的原因是id列和索引是相同的,并且两个数据帧的顺序是相同的?谢谢@Ben.T-很好。让我澄清一下,我们可以假设所有数据帧的顺序相同。在这种情况下,
combine\u first
看起来可以工作,即使
id
与索引不同。如果它们的顺序不一样,那么就不一样了work@jetvermillion是的,如果它们以相同的方式使用相同的索引排序,那么首先组合_是一个很好的解决方案
reduce(lambda new_df, df_to_combine: new_df.combine_first(df_to_combine.set_index('id')),
       my_list_df[1:], my_list_df[0].set_index('id')).reset_index()