我正在使用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
我正在寻找一种比较两个数据帧中的列A
,B
,C
,D
的方法,以便删除与{ {1}}在任何列中。
在这种情况下,由于没有匹配项,因此我希望它删除行10
和201
,其中行202
和200
有1个匹配项(即使第203
行的1列不匹配)。
我尝试遍历第2帧中的所有行,比较
200
这删除了一些行,但不是全部。
是否存在一种有效的方法来遍历所有行并检查另一个数据帧的任何列中是否存在单个匹配项?
预先感谢您的帮助!
答案 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)]