如何比较两个数据框并使用 python 获取不匹配的行?

How to compare two data frame and get the unmatched rows using python?

我有两个数据框,df1 和 df2。现在,df1 包含 6 条记录,df2 包含 4 条记录。我想从中得到无与伦比的记录。我尝试了但出现错误 ValueError: Can only compare identically-labelled DataFrame objects 我猜这是由于 df 的长度,因为 df1 有 6 而 df2 有 4 但我如何比较它们并获得不匹配的行?

代码

df1=
  a  b  c
0 1  2  3
1 4  5  6
2 3  5  5
3 5  6  7
4 6  7  8
5 6  6  6


df2 =
  a  b  c
0 3  5  5
1 5  6  7
2 6  7  8
3 6  6  6

index = (df != df2).any(axis=1)
df3 = df.loc[index]

给出:

ValueError: Can only compare identically-labelled DataFrame objects

预期输出:

 a  b  c
0 1  2  3
1 4  5  6

我知道错误是由于长度引起的,但是有什么方法可以比较两个数据帧并从中找出不匹配的记录吗?

df.mergeindicator=True 结合使用并选择除 both 之外的所有行:

In [173]: df = df1.merge(df2, indicator=True, how='outer').query('_merge != "both"').drop('_merge', 1)

In [174]: df
Out[174]: 
   a  b  c
0  1  2  3
1  4  5  6

MultiIndex.from_frame + isin

我们可以在df1df2上使用MultiIndex.from_frame创建相应的多索引,然后使用isin测试从[=创建的索引的成员资格index 中的 15=] 从 df2 创建以创建一个布尔掩码,然后可用于过滤不匹配的行。

i1 = pd.MultiIndex.from_frame(df1)
i2 = pd.MultiIndex.from_frame(df2)
df1[~i1.isin(i2)]

结果

   a  b  c
0  1  2  3
1  4  5  6