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

3
我有两个数据框,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

我知道这个错误是由于长度问题导致的,但是有没有办法比较两个数据框并将不匹配的记录取出来呢?


逻辑之一是检查两者中的每一行。然后使用np.setdiff1d函数来获取集合差异。np.setdiff1d([0, 1, 2, 3, 4, 5],[np.where(np.all(df1==df2.iloc[x],axis=1))[0][0] for x in range(4)]) - Davinder Singh
2个回答

5
使用带有参数indicator=Truedf.merge,并选择除了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

4

MultiIndex.from_frame + isin

我们可以使用MultiIndex.from_frame函数在df1df2上创建相应的多级索引,然后使用isin函数测试从df1创建的索引是否属于从df2创建的index,从而创建一个布尔型掩码,该掩码可用于过滤不匹配的行。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接