繁体   English   中英

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

[英]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个数据框中的ABCDA ,以便删除在任何列中都不匹配10的行。

在这种情况下,我希望它删除第201202行,因为没有匹配项,第200203行有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM