熊猫:两个数据帧的差异

时间:2016-04-27 13:55:58

标签: python pandas dataframe diff

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

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 valueOutputting difference in two Pandas dataframes side by side - highlighting the difference

但这些与我的问题不符。

谢谢

安迪

6 个答案:

答案 0 :(得分:77)

merge 2 dfs使用方法'外部'并传递参数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

答案 1 :(得分:6)

diff = set(zip(df2.Buyer, df2.Quantity)) - set(zip(df1.Buyer, df1.Quantity))

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

答案 2 :(得分:2)

如果您只想将新买家添加到其他df,请尝试以下操作:

df_delta=df2[df2['Buyer'].apply(lambda x: x not in df1['Buyer'].values)]

答案 3 :(得分:2)

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

df1.compare(df2)

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

答案 4 :(得分:0)

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

csv

答案 5 :(得分:0)

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

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