【问题标题】:Pandas find super string in one Series from another Series熊猫在一个系列中从另一个系列中找到超级字符串
【发布时间】:2018-12-07 15:57:40
【问题描述】:

这不一定需要在 pandas 中完成,但如果可以在 pandas 中完成就更好了。

假设我有一个列表或字符串系列:

['XXY8779','0060-19','McChicken','456728']

我还有另一个列表或系列,其中包含原始的子字符串,如下所示:

['60-19','Chicken','8779','1124231','92871','johnson']

这将返回如下内容:

[True, True, True, False]

我正在寻找类似的匹配:

^[a-zA-Z0-9.,$;]+ < matching string in other list >

换句话说,以 1 个或多个任意字符开头但其余部分与我的另一个列表中的一个字符串完全匹配的东西。

有人对实现此目的的最佳方法有任何想法吗?

谢谢!

【问题讨论】:

  • 匹配是否总是在您的第一个列表中的字符串末尾?
  • 相关:标准的 Pandas 算法并不是特别有效。如果您需要性能,请考虑基于 trie 的方法,例如this Aho-Corassick solution.
  • @ALollz 是的,总是在最后。

标签: python regex string pandas substring


【解决方案1】:

使用str.contains

'|'.join(s2) 生成一个字符串,告诉contains 使用regex 并使用或逻辑。

s1 = pd.Series(['XXY8779', '0060-19', 'McChicken', '456728'])

s2 = ['60-19', 'Chicken', '8779', '1124231', '92871', 'johnson']

s1.str.contains('|'.join(s2))

0     True
1     True
2     True
3    False
dtype: bool

【讨论】:

  • not (not (s1.str.contains('|'.join(s2)))) 也可以
  • 如果您确实有需要转义的字符,'|'.join(map(re.escape, s2))
  • @ℕʘʘḆḽḘ 这只是对他们所写内容的双重否定?
  • @Graipher Noobs 有一种我很欣赏的罕见幽默感 (-:
  • :) 确实哈哈哈
【解决方案2】:

因为它总是在最后,你可以使用 .str.endswith 和 any 来短路逻辑。 s1s2 只是您上面的列表(但如果它们是 pd.Series 也可以)

[any(i.endswith(j) for j in s2) for i in s1]
#[True, True, True, False]

然后您可以使用pd.Series 将其转换为系列,或者直接将该列表用作掩码。

【讨论】:

    猜你喜欢
    • 2020-05-29
    • 2016-10-22
    • 1970-01-01
    • 2014-06-26
    • 2021-05-15
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    相关资源
    最近更新 更多