Python 熊猫从一个数据帧中删除另一个数据帧中的所有元素

Python 熊猫从一个数据帧中删除另一个数据帧中的所有元素,python,pandas,Python,Pandas,我想根据列的子集找出两个数据帧(df1中的元素,而不是df2中的元素)之间的差异。这两个数据帧具有相同的模式 假设df1包含 col1 col2 col3 col4 A B C D A C D D df2包含 col1 col2 col3 col4 A D D D A B D D 我想要df1中的项目,df2中没有col1和col2匹配的项目。因此,在这种情况下,预期的输出将只是df1的第二行 A C D

我想根据列的子集找出两个数据帧(df1中的元素,而不是df2中的元素)之间的差异。这两个数据帧具有相同的模式

假设df1包含

col1 col2 col3 col4
A    B    C    D
A    C    D    D
df2包含

col1 col2 col3 col4
A    D    D    D
A    B    D    D
我想要df1中的项目,df2中没有col1和col2匹配的项目。因此,在这种情况下,预期的输出将只是df1的第二行

A    C    D    D

我尝试了不同版本的
isin
,但我很难找到任何有效的方法。我试过了,但这只适用于单列。

使用isin的问题是,如果使用数据帧,索引也必须匹配。我不知道你的索引是什么,但是如果它在col1和col2相等的地方不同,它仍然会返回一个负的结果

将第二个数据帧转换为列表将使其工作(因为这会删除索引)。
isin
分别匹配两列,但使用
all(轴1)
可将其过滤到两列都匹配的情况

sub = ['col1', 'col2']
mask = df1[sub].isin(df2[sub].to_dict(outtype='list')).all(axis=1)

df1[~mask]

  col1 col2 col3 col4
1    A    C    D    D

我不知道这是否有效,但我在几个小时的实验后找到了一种方法。它首先需要重新索引数据帧,以使用您关心的列作为索引

df1.set_index(['col1', 'col2'], inplace=True)
df2.set_index(['col1', 'col2'], inplace=True)

df1[df1.index.map(lambda x: x not in df2.index)]

我知道这是一个很老的问题。但如果我搜索这个问题,这在谷歌上是最重要的。如果在两个数据帧中都有一列的值是唯一的,则可以这样做

  uniq__value_list = df1[col1].tolist()
  df3 = df2[~df.col1.isin(uniq__value_list)]

现在,第三个数据帧将具有df1中的值,而不是df2中的值。

为什么说“基于col1和col2”?您的预期输出看起来更像是df1的第二行。我的意思是我想要df1中的项目,而不是df2中的项目,只查看col1和col2列。感谢您的回复,+1。我发布了一个我想出的解决方案。你知道这两种方法是否更有效吗?我不知道熊猫在引擎盖下到底在干什么。