我有两个在不同时间拍摄的数据帧快照。我试图在这两个数据框中找到不同的行。从技术上讲,任何行都可以更改。
快照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
答案 0 :(得分:1)
您可以按DataFrame.ne
和DataFrame.any
比较所有值(两个DataFrame中必须有相同的索引和相同的列),然后将concat
与DataFrame.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