2016-08-13 123 views
0

不知道这是否可能。我有都喜欢这种两个dataframes DF1和DF2:两个数据帧合并为一个

df1    df2    

id value  id value  
a  5   a 3   
c  9   b 7   
d  4   c 6   
f  2   d 8   
       e 2   
       f 1   

他们在现实生活中有更多的条目比这里呈现。我想根据df1和df2中的值创建第三个数据框df3。写DF3(如果同一ID存在于两个DF1和DF2)当DF1任何值将优先值DF2所以在这个例子中,我将返回:

df3 
id value 
a  5 
b  7 
c  9 
d  4 
e  2 
f  2 

我已经用DF2的尝试base(df2将拥有整个宇宙中的所有id),然后覆盖df1中存在的id的值,但找不到合并语法来完成此操作。任何帮助将不胜感激。

感谢

回答

1

你可以使用combine_first,前提是您首先进行数据帧指数id(这样values得到由id排列):

In [80]: df1.set_index('id').combine_first(df2.set_index('id')).reset_index() 
Out[80]: 
    id value 
0 a 5.0 
1 b 7.0 
2 c 9.0 
3 d 4.0 
4 e 2.0 
5 f 2.0 

既然你提到的合并,你可能有兴趣看到 您可以合并df1和,然后使用fillna为'从df2 S上的value柱值的值列替换中的NaN df1

df1 = pd.DataFrame({'id': ['a', 'c', 'd', 'f'], 'value': [5, 9, 4, 2]}) 
df2 = pd.DataFrame({'id': ['a', 'b', 'c', 'd', 'e', 'f'], 'value': [3, 7, 6, 8, 2, 1]}) 
result = pd.merge(df2, df1, on='id', how='left', suffixes=('_x', '')) 
result['value'] = result['value'].fillna(result['value_x']) 
result = result[['id', 'value']] 
print(result) 

产生同样的结果,虽然第一种方法是简单的。