比较 pandas 中两个数据帧的行

Compare rows of two dataframes in pandas

我有两个数据框,第一个是我目前在数据库中的数据,第二个是一个可能更改了字段的文件: name and/or cnpj and/or create_date

基于此,我需要创建第三个数据框,其中仅包含经过某种更改的行,如预期输出示例中所示。

进行比较的关键是: id_account

数据框 1:

id_account name cnpj create_date
10 Agency Criss 10203040 2022-05-30
20 Agency Angel 11213141 2022-05-30
30 Supermarket Mario Bros 12223242 2022-05-30
40 Agency Mister M 13233343 2022-05-30
50 Supermarket Pokemon 14243454 2022-05-30
60 Supermarket of Dreams 15253580 2022-05-30

数据框 2:

id_account name cnpj create_date
10 Supermarket Carol 80502030 2022-05-30
20 Agency Angel 11213141 2022-05-30
30 Supermarket Mario Bros 12223242 2022-05-30
40 Supermarket Magical 60304050 2022-05-30
50 Supermarket Pokemon 14243454 2022-05-30
60 Supermarket of Dreams 90804050 2022-05-30

预期输出:

id_account name cnpj create_date
10 Supermarket Carol 80502030 2022-05-30
40 Supermarket Magical 60304050 2022-05-30
60 Supermarket of Dreams 90804050 2022-05-30

我该怎么做?我已经寻找了几种方法,但我对索引感到困惑。

如果您的两个数据框具有相同的列和相同的行数,您可以检查它们是否相等并使用 any(axis=1) 查找任何列发生变化的行:

new_df = df2[(df1 != df2).any(axis=1)]

输出:

>>> new_df
   id_account                   name      cnpj create_date
0          10      Supermarket Carol  80502030  2022-05-30
3          40    Supermarket Magical  60304050  2022-05-30
5          60  Supermarket of Dreams  90804050  2022-05-30

如果数据具有相同的列,但行数不同,这是一种可能的解决方案:

res = (pd.concat([df1,df2])
       .drop_duplicates(keep=False)
       .drop_duplicates(subset='id_account', keep='last')
      )

输出:

   id_account                   name      cnpj create_date
0          10      Supermarket Carol  80502030  2022-05-30
3          40    Supermarket Magical  60304050  2022-05-30
5          60  Supermarket of Dreams  90804050  2022-05-30