比较 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
我有两个数据框,第一个是我目前在数据库中的数据,第二个是一个可能更改了字段的文件:
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