熊猫合并数据框,覆盖键上的值

时间:2018-09-23 16:55:40

标签: python pandas dataframe

很抱歉,如果这个问题重复。我真的找不到这个特定案例的答案。如果键('id')也存在于第二个数据帧中,则可以合并/合并两个数据帧,同时覆盖第一个数据帧中的值吗? 类似于SQL中的“ INSERT-ON DUPLICATE KEY UPDATE”命令。

第一个数据帧“ df1”:

    id      value
0   100010  25
1   100011  22
2   100012  30

第二个数据帧“ df2”:

    id      value
0   100012  35
1   100013  36

合并数据框会产生新列,并将旧数据保留为'id''100012':

df3 =  pd.merge(df1, df2, on='id', how='outer')
print(df3)

    id      value_x value_y
0   100010  25.0    NaN
1   100011  22.0    NaN
2   100012  30.0    35.0
3   100013  NaN     36.0

是否可以直接从合并功能获得所需的输出?因此,仅更新了'id''100012'并添加了新行'100013'?

    id      value
0   100010  25
1   100011  22
2   100012  35
3   100013  36

我尝试了mergejoinupdatecombine_first,但都没有成功。感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

编辑:

最简单的方法是:

>>> df1=df1.set_index('id')
>>> df2=df2.set_index('id')

df2上使用Combine_first

>>> df2.combine_first(df1)
       value
id
100010    25
100011    22
100012    35
100013    36

旧帖子:

作为替代方案,您可以使用标准的python字典

>>> df1=df1.set_index('id')
>>> df2=df2.set_index('id')

df1

制作字典
>>> d = df1.to_dict( 'index' )
>>> d
{'100012': {'value': '30'}, '100010': {'value': '25'}, '100011': {'value': '22'}}

update()和其他数据框字典-重复的键将更新为整行

>>> d.update( df2.to_dict( 'index' ) )
>>> d
{'100012': {'value': '35'}, '100013': {'value': '36'}, '100010': {'value': '25'}, '100011': {'value': '22'}}

将其重新变成数据框:

>>> pd.DataFrame.from_dict( d, 'index' )
       value
100010    25
100011    22
100012    35
100013    36

如果您希望将它们全部保留在大熊猫中-RafaelC的解决方案更好

答案 1 :(得分:1)

仅对不在df2索引中的索引使用pd.concat。让

df  = df.set_index('id')
df2 = df2.set_index('id')

然后

>>> merged = pd.concat([df[~df.index.isin(df2.index)], df2]).reset_index()

    id      value
0   100010  25
1   100011  22
2   100012  35
3   100013  36