繁体   English   中英

两个数据帧的差异

[英]Diff of two Dataframes

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

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

包含在差异中:

我已经尝试过: 逐行比较两个不同长度的数据帧并为每行添加具有相等值的列并比较两个数据帧并排输出它们的差异

但这些与我的问题不符。

使用方法 'outer' 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

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

df2[ ~df2.isin(df1)].dropna()
diff = set(zip(df2.Buyer, df2.Quantity)) - set(zip(df1.Buyer, df1.Quantity))

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

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

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

如果您只关心将新买家添加到另一个 df,请尝试以下操作:

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

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

df1.compare(df2)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM