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()