我需要逐行比较两个不同大小的数据帧并打印出不匹配的行。让我们采取以下两点:
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和Outputting difference in two Pandas dataframes side by side - highlighting the difference
但这些与我的问题不符。
谢谢
安迪
merge
2 dfs使用方法'outer'并传递param indicator=True
这将告诉您行是否仅存在于/ left only / right中,然后您可以在以下情况后过滤合并的df:
In [22]:
merged = df1.merge(df2, indicator=True, how='outer')
merged[merged['_merge'] == 'right_only']
Out[22]:
Buyer Quantity _merge
3 Carl 2 right_only
4 Mark 1 right_only
diff = set(zip(df2.Buyer, df2.Quantity)) - set(zip(df1.Buyer, df1.Quantity))
这是第一个想到的解决方案。然后,您可以将差异集放回DF中进行演示。
如果您只关心将新买家添加到其他df,请尝试以下操作:
df_delta=df2[df2['Buyer'].apply(lambda x: x not in df1['Buyer'].values)]
你可能会发现这是最好的:
df2[ ~df2.isin(df1)].dropna()
@ EdChum的答案是自我解释的。但是使用not 'both'
条件更有意义,你不需要关心比较的顺序,这就是真正的差异应该是什么。为了回答你的问题:
merged = df1.merge(df2, indicator=True, how='outer')
merged.loc = [merged['_merge'] != 'both']