用另一个数据框覆盖一个数据框,只保留新的或更改的行

我有两个pandas的数据框,看起来像下面这样:

DF1:

RecorderID GroupID Location ... SomeColumn CT-1000001 BV- Cape Town SomeValue CT-1000002 MP- Johannesburg SomeValue CT-1000003 BV- Durban SomeValue 

DF2:

 RecorderID GroupID Location ... SomeColumn CT-1000001 BV- Durban ... SomeValue CT-1000003 BV- Durban ... SomeValue 

这两个dataframe实际上很大,有很多列和很多行。 我想比较两个dataframe,并以一个dataframe结束以下操作(RecorderID是我的主键):

  1. 所有在两个数据框中值不同的行都必须采用df1的值并保留。
  2. 所有存在于df1但不存在于df2中的行必须被插入。
  3. 所有包含在两个数据框中且相同的值都必须删除。

所以,以上面的例子,我会得到以下的数据框:

 RecorderID GroupID Location ... SomeColumn CT-1000001 BV- Cape Town SomeValue CT-1000002 MP- Johannesburg SomeValue 

PS:我注意到写出一个数据框到Excel时,它插入一个索引列作为第一列。 我如何指定RecorderID是我的主键,它应该使用它来索引值? 我试过了:

 df = read_excel('file.xlsx', 'sheet1', index_col='RecorderID') 

但是这只是删除RecorderID列,并添加一个编号的索引列,当我写出来的Excel。

谢谢!

如果你运行的是pandas的最新版本,那么你可以merge和指定合并方法left ,另外我们可以设置indicator=True这将添加一个列_merge ,你会告诉如果行存在于left_onlyboth ,我们然后可以过滤这些行:

 In [91]: merged = pd.merge(df1,df2,indicator=True, how='left' ) merged Out[91]: RecorderID GroupID Location SomeColumn _merge 0 CT-1000001 BV- Cape Town SomeValue left_only 1 CT-1000002 MP- Johannesburg SomeValue left_only 2 CT-1000003 BV- Durban SomeValue both In [92]: merged[merged['_merge'] == 'left_only'] Out[92]: RecorderID GroupID Location SomeColumn _merge 0 CT-1000001 BV- Cape Town SomeValue left_only 1 CT-1000002 MP- Johannesburg SomeValue left_only