用另一个数据框覆盖一个数据框,只保留新的或更改的行
我有两个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是我的主键):
- 所有在两个数据框中值不同的行都必须采用df1的值并保留。
- 所有存在于df1但不存在于df2中的行必须被插入。
- 所有包含在两个数据框中且相同的值都必须删除。
所以,以上面的例子,我会得到以下的数据框:
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_only
或both
,我们然后可以过滤这些行:
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