熊猫在一个系列中从另一个系列中找到超级字符串

Posted

技术标签:

【中文标题】熊猫在一个系列中从另一个系列中找到超级字符串【英文标题】: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 是的,总是在最后。 【参考方案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 将其转换为系列,或者直接将该列表用作掩码。

【讨论】:

以上是关于熊猫在一个系列中从另一个系列中找到超级字符串的主要内容,如果未能解决你的问题,请参考以下文章

比较熊猫系列中连续行的字符串值

日期时间到熊猫系列中的字符串

是否可以将熊猫系列附加到列表中

熊猫如何在一个系列中找到其差异在一定距离内的连续值

用列/系列中的值替换熊猫子字符串

按字符串长度对熊猫系列中的列表进行排序