熊猫-比较两个数据框并查找已更改的行

时间:2020-08-18 09:46:08

标签: pandas

我有两个在不同时间拍摄的数据帧快照。我试图在这两个数据框中找到不同的行。从技术上讲,任何行都可以更改。

快照1:

prod_id, prod_name, sale, price_per_unit
prod_a, prod_name_a, 10, 20
prod_b, prod_name_b, 4, 3
prod_c, prod_name_c, 3, 10
prod_d, prod_name_d, 5, 4

快照2:

prod_id, prod_name, sale, price_per_unit
prod_a, prod_name_a, 10, 20
prod_b, prod_name_b, 14, 13
prod_c, prod_name_c, 5, 1
prod_d, prod_name_d, 7, 2

我正在尝试比较这些数据并返回已更改的行。

预期输出:

prod_id, prod_name, sale, price_per_unit, source
prod_b, prod_name_b, 4, 3, snapshot_1
prod_b, prod_name_b, 14, 13, snapshot_2
prod_c, prod_name_c, 3, 10, snapshot_1
prod_c, prod_name_c, 5, 1, snapshot_2
prod_d, prod_name_d, 5, 4, snapshot_1
prod_d, prod_name_d, 7, 2, snapshot_2

1 个答案:

答案 0 :(得分:1)

您可以按DataFrame.neDataFrame.any比较所有值(两个DataFrame中必须有相同的索引和相同的列),然后将concatDataFrame.assign的新列一起使用,进行排序最后创建默认索引:

mask = df1.ne(df2).any(axis=1)

df = pd.concat([df1[mask].assign(source = 'snapshot_1'), 
                df2[mask].assign(source = 'snapshot_2')]
       ).sort_index().reset_index(drop=True)

print (df)
  prod_id    prod_name  sale  price_per_unit      source
0  prod_b  prod_name_b     4               3  snapshot_1
1  prod_b  prod_name_b    14              13  snapshot_2
2  prod_c  prod_name_c     3              10  snapshot_1
3  prod_c  prod_name_c     5               1  snapshot_2
4  prod_d  prod_name_d     5               4  snapshot_1
5  prod_d  prod_name_d     7               2  snapshot_2