我有一个大df(df1),每一列都有二进制输出,如下所示:
df1:
a b c d
1 1 0 1 0
2 0 0 0 0
3 0 1 0 1
4 1 1 0 0
5 1 0 0 0
6 1 0 1 1
...
我还有另一个较小的df(df2),其中包含一些“模板”行,我想检查df1s行是否包含。模板如下:
df2:
a b c d
1 1 0 1 0
2 1 1 1 1
3 0 0 0 1
4 1 1 0 0
我想做的是有效地搜索大型df,以查找这些少量模板,因此在此示例中,第1、3、4、6行将匹配,但第2行和第5行将不匹配。我希望大df中的任何行都具有通过测试的额外1(即存在模板行,但该行中也有一些额外的1)。
我知道我可以有一个嵌套循环,遍历大和小的dfs的所有行,并将行作为np.arrays进行匹配,但这似乎是一种效率极低的方法。我想知道是否存在针对此问题的非迭代基于pd的解决方案?
非常感谢您!
次要功能编辑:除了搜索和匹配外,我还试图保留df2中与df1中的每一行匹配的模板行的列表,因此我可以统计大df中显示多少模板,他们是哪个。这是此答案(Compare Python Pandas DataFrames for matching rows)无法正常工作的原因之一。
答案 0 :(得分:0)
此逻辑将根据您的要求告诉您哪里有匹配项。在这里,我只是在原始DF中创建了一个新列,但是您可能想要创建第三个DF,并为每个测试继续向其中添加列。然后,您可以汇总列/行以获得总计:
df1
a b c d
1 1 0 1 0
2 0 0 0 0
3 0 1 0 1
4 1 1 0 0
df2
a b c d
1 1 0 1 0
2 1 1 1 1
3 0 0 0 1
4 1 1 0 0
逻辑
t_match =[]
for index, row in df2.iterrows():
t_match.append(((df1-row) >= 0).all(axis=1).sum())
输出
t_match
[1, 0, 1, 1]