【问题标题】:Pandas search if full rows of a large df contain template rows from a another smaller df?熊猫搜索大df的整行是否包含另一个较小df的模板行?
【发布时间】:2020-06-23 22:57:41
【问题描述】:

我有一个大的 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 的解决方案?

非常感谢!

次要功能编辑:除了搜索和匹配之外,我还尝试保留 df1 中的每一行匹配的 df2 中哪个模板行的列表,以便我可以统计大 df 中显示的模板数量和他们是哪些。这是这个答案(Compare Python Pandas DataFrames for matching rows)不起作用的原因之一。

【问题讨论】:

  • @Chris,不完全是因为我还想知道显示哪个模板以及显示频率。我还想保留 包含 模板但也有额外 1 的行...
  • 您能否分享示例数据框以及您迄今为止尝试过的最少代码?

标签: python pandas dataframe


【解决方案1】:

此逻辑会根据您的要求告诉您哪里有匹配项。在这里,我刚刚在原始 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]

【讨论】:

  • 非常感谢@Chris 的回答,但这是假设两个 df 的大小相同。我的 df1 比具有模板行(约 10 行)的 df2 大得多(约 50k 行)。我想在 df1 的 50k 行中搜索这 10 个模板。
  • 更新为遍历模板并在每个模板行的原始 df 中查找任何匹配项,将匹配项的总和保留在列表中
  • 再次感谢@Chris。我认为除了 .all(axis=1) 和 sum() 正在做什么之外,它是如何工作的。你介意解释一下吗?
  • 它对 >=0 返回的真/假进行逐行求和,其中真为 1,假为 0
  • 好吧,我试过了,用各种值测试过。 100% 有效,是一个非常优雅的解决方案。
猜你喜欢
  • 2021-10-31
  • 2020-12-13
  • 2021-12-26
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 2018-07-14
相关资源
最近更新 更多