一个重要的边界情况
考虑以下情况,第二个数据帧中有一个额外的重复条目:('Carl', 5)
df1 = DataFrame({ 'Buyer': ['Carl', 'Carl', 'Carl'],
'Quantity': [ 18 , 3 , 5 ] })
df2 = DataFrame({ 'Buyer': ['Carl', 'Mark', 'Carl', 'Carl', 'Carl'],
'Quantity': [ 2 , 1 , 18 , 5 , 5 ] })
EdChum的回答将为您提供以下内容:
merged = df1.merge(df2, indicator=True, how='outer')
print(merged[merged['_merge'] == 'right_only'])
Buyer Quantity _merge
4 Carl 2 right_only
5 Mark 1 right_only
正如您所看到的,该解决方案忽略了额外的重复值,这取决于您正在做什么,这是您想要避免的。
以下是更有可能满足您需求的解决方案:
df1['duplicate_counter'] = df1.groupby(list(df1.columns)).cumcount()
df2['duplicate_counter'] = df2.groupby(list(df2.columns)).cumcount()
merged = df1.merge(df2, indicator=True, how='outer')
merged[merged['_merge'] == 'right_only']
Buyer Quantity duplicate_counter _merge
3 Carl 2 0 right_only
4 Mark 1 0 right_only
5 Carl 5 1 right_only
重复计数器确保每行都是唯一的,这意味着不会删除重复值。合并后,您可以删除重复计数器。