Python /熊猫:比较两个数据框中的多列,如果找不到匹配项,则删除行

时间:2019-09-15 10:52:43

标签: python pandas dataframe

我正在使用Pandas学习Python,并尝试找出最有效的方法来比较2个数据帧上的多个选定列以找到匹配项。例如,如果我有以下两个数据框:

Frame 1
      A     B    C    D    E    F    
001   10    0    0    10   0    10


Frame 2
      A     B    C    D    E    F
200   10    0    10   0    10   0
201   0     10   10   0    0    10
202   0     10   0    0    0    0
203   0     0    0    10   0    10

我正在寻找一种比较两个数据帧中的列ABCD的方法,以便删除与{ {1}}在任何列中。

在这种情况下,由于没有匹配项,因此我希望它删除行10201,其中行202200有1个匹配项(即使第203行的1列不匹配)。

我尝试遍历第2帧中的所有行,比较

200

这删除了一些行,但不是全部。

是否存在一种有效的方法来遍历所有行并检查另一个数据帧的任何列中是否存在单个匹配项?

预先感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我认为最简单的解决方案是将10中的一个非df1替换为df2中的另一个值,将每个列与isin进行比较,以便在{ {1}}有更多行,请创建df1 DataFrame,boolean并按concat进行过滤,以测试每行至少一个any

True

替代解决方案:

letters = ['A', 'B', 'C', 'D']

out = []
for letter in letters:
    m = df2[letter].mask(lambda x: x!=10, 0).isin(df1[letter].mask(lambda x: x!=10, 1))
    out.append(m)

df = df2[pd.concat(out, axis=1).any(axis=1)]