熊猫搜索大df的整行是否包含另一个小df的模板行?

时间:2020-03-11 21:46:30

标签: python pandas dataframe

我有一个大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)无法正常工作的原因之一。

1 个答案:

答案 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]