这可能是一个非常基本的问题。假设我有两个数据框:
>>> 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)
但这会导致重复的列(见下文),我必须通过填充 nans、重命名列,然后删除重复项。如果我要合并 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
执行此操作的更好方法是什么?
最佳答案
df1.combine_first(df2)
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
编辑
我们可以使用DataFrame.set_index
+ DataFrame.combine_first
map
和 reduce
用于 n DataFrames。
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
:
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()
关于python - 将多个数据帧与互补缺失值组合起来的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61621816/