熊猫:两个数据帧的差异

And*_*ndy 39 python diff dataframe pandas

我需要逐行比较两个不同大小的数据帧并打印出不匹配的行.让我们采取以下两点:

df1 = DataFrame({
'Buyer': ['Carl', 'Carl', 'Carl'],
'Quantity': [18, 3, 5, ]})

df2 = DataFrame({
'Buyer': ['Carl', 'Mark', 'Carl', 'Carl'],
'Quantity': [2, 1, 18, 5]})
Run Code Online (Sandbox Code Playgroud)

什么是在df2上逐行排列并打印不在df1中的行的最有效方法,例如:

Buyer     Quantity 
Carl         2
Mark         1
Run Code Online (Sandbox Code Playgroud)

重要提示:我不想要排:

Buyer     Quantity 
Carl         3
Run Code Online (Sandbox Code Playgroud)

包含在差异中:

我已经尝试过: 逐行比较两个不同长度的数据帧,并为每行添加相同值的列, 并将两个Pandas数据帧中的输出差异并排显示 - 突出显示差异

但这些与我的问题不符.

谢谢

安迪

EdC*_*ica 88

merge2个DFS使用方法"外",并通过PARAM indicator=True这会告诉你行是否存在于/只留下/只的权利,然后你可以筛选合并后的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
Run Code Online (Sandbox Code Playgroud)


gwe*_*ter 9

从 Pandas 1.1.0 开始,有 pandas.DataFrame.compare:

df1.compare(df2)
Run Code Online (Sandbox Code Playgroud)

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.compare.html

  • 这不适用于不等索引(又名,两个具有不同行数的数据帧) (8认同)

A. *_*jar 8

您可能会发现这是最好的:

df2[ ~df2.isin(df1)].dropna()
Run Code Online (Sandbox Code Playgroud)


Sha*_*ani 8

@EdChum 的回答是不言自明的。但是使用not 'both'条件更有意义,您不需要关心比较的顺序,这就是真正的差异应该是什么。为了回答你的问题:

merged = df1.merge(df2, indicator=True, how='outer')
merged.loc = [merged['_merge'] != 'both']
Run Code Online (Sandbox Code Playgroud)

  • 第二行失败,应交换为: `merged.loc[merged['_merge'] != 'both']` (3认同)

Sho*_*alt 6

diff = set(zip(df2.Buyer, df2.Quantity)) - set(zip(df1.Buyer, df1.Quantity))
Run Code Online (Sandbox Code Playgroud)

这是第一个想到的解决方案.然后,您可以将差异集放回DF中进行演示.