Python 熊猫从一个数据帧中删除另一个数据帧中的所有元素
我想根据列的子集找出两个数据帧(df1中的元素,而不是df2中的元素)之间的差异。这两个数据帧具有相同的模式 假设df1包含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
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。我发布了一个我想出的解决方案。你知道这两种方法是否更有效吗?我不知道熊猫在引擎盖下到底在干什么。