我想基于列的子集找到两个数据帧(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
的不同变体,但我很难找到有用的东西。我尝试了https://stackoverflow.com/a/16704977/1639228,但这只适用于单列。
答案 0 :(得分:2)
使用isin
的问题是,如果使用DataFrame,索引也必须匹配。我不知道你的索引是什么,但是如果它与col1和col2相等的不同,它将会返回一个否定的结果。
将第二个DataFrame转换为列表将使其工作(因为这会删除索引)。 isin
分别与两列匹配,但all(axis-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
答案 1 :(得分:1)
我知道这是一个非常古老的问题。但是,如果我搜索这个问题,这在谷歌上排在首位。如果数据框中的列都是值唯一的,则可以像这样完成
uniq__value_list = df1[col1].tolist()
df3 = df2[~df.col1.isin(uniq__value_list)]
现在,第三个数据帧的值将是df1中的,而不是df2 。
答案 2 :(得分:0)
我不知道这是否有效,但我在经过数小时的实验后找到了一种方法。它涉及首先重新索引数据帧以使用您关心的列作为索引。
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)]