[英]Python/Pandas: Compare multiple columns in two dataframes and remove row if no matches found
我正在使用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
我正在寻找一种比较2个数据框中的A
, B
, C
, D
列A
,以便删除在任何列中都不匹配10
的行。
在这种情况下,我希望它删除第201
和202
行,因为没有匹配项,第200
和203
行有1个匹配项(即使第200
行有1个不匹配的列)。
我尝试遍历第2帧中的所有行,比较
letters = ['A', 'B', 'C', 'D']
for ix, row in frame_2():
for letter in letters:
if frame_1[letter].values[0] != frame_2.loc[ix, letter]:
frame_2.drop(ix, inplace=True)
break
这删除了一些行,但不是全部。
有没有一种有效的方法可以遍历所有行并检查另一个数据框的任何列中是否有单个匹配项?
先谢谢您的帮助!
我认为最简单的解决方案是将df1
一个非10
值替换为df2
另一个值,将每列与isin
进行比较,以便在df1
具有更多行的情况下比较更多值,创建boolean
DataFrame, 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)]
替代解决方案:
df = df2[np.logical_or.reduce(out)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.