我需要比较两个不同大小的 Dataframe ,并打印出不匹配的行。让我们采取以下两个:
df1 = DataFrame({
'Buyer': ['Carl', 'Carl', 'Carl'],
'Quantity': [18, 3, 5, ]})
df2 = DataFrame({
'Buyer': ['Carl', 'Mark', 'Carl', 'Carl'],
'Quantity': [2, 1, 18, 5]})
什么是最有效的方式来逐行遍历df2并打印出不在df1中的行,例如:
Buyer Quantity
Carl 2
Mark 1
重要提示:我不希望有行:
Buyer Quantity
Carl 3
包括在差异中:
我已经试过了:Comparing two dataframes of different length row by row and adding columns for each row with equal value和Compare two DataFrames and output their differences side-by-side
但这些与我的问题不匹配。
8条答案
按热度按时间3zwjbxry1#
merge
使用方法'outer'并传递参数indicator=True
这将告诉您行是否存在于两个/left only/right only中,然后您可以过滤合并的df:6yoyoihd2#
你可能会发现这是最好的:
23c0lvtd3#
@EdChum的答案是不言自明的。但是使用
not 'both'
条件更有意义,而且你不需要关心比较的顺序,这就是真实的的diff应该是什么样子的。为了回答你的问题:nszi6y054#
这是我想到的第一个解决方案,然后你可以将diff集放回DF中进行展示。
cygmwpex5#
从Pandas 1.1.0开始,有pandas.DataFrame.compare:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.compare.html
g2ieeal76#
如果您只关心将新买家添加到其他df,请尝试以下操作:
xcitsw887#
一个重要的边缘用例
考虑下面的情况,在第二个 Dataframe 中有一个额外的重复条目。
('Carl', 5)
EdChum的回答会给予你以下几点:
正如您所看到的,解决方案忽略了额外的重复值,这取决于您正在做的事情是您想要避免的。
以下是一个更有可能实现您所需的解决方案:
重复计数器确保每一行都是唯一的,这意味着不会删除重复的值。合并后,您可以删除duplicate_counter。
q3aa05258#
还有datacompy。它允许导出一些基于字符串的比较报告,如下所示: