Pandas:加速许多字符串搜索



我有一个系列,其中每个元素都是一个空列表:

matches = pd.Series([[]]*4)

和另一系列字符串:

strs = pd.Series(["word3, xx word1 word1", "yy", "word2. o", "awldkj"])

我想用一组关键字中不区分大小写的关键字匹配来填充cats

terms = ["word1", "Word2", "worD3"]

目前,我逐一迭代每个搜索词

for tcat in tcats:
tcat_re = rf'b{tcat}b'
has_cat = strs.str.contains(tcat_re, case=False)
print(has_cat.sum(), "matches for", tcat)
w_cats = has_cat.map({True: [tcat], False: []})
cats = cats.combine(w_cats, lambda li, li2: li + li2)

这就产生了正确的解决方案:

1 matches for word1
1 matches for Word2
1 matches for worD3
In [507]: matches
Out[509]: 
0    [word1, worD3]
1                []
2           [Word2]
3                []

需要注意的两个方面:

  • matches中匹配项的顺序无关紧要
  • CCD_ 3在CCD_ 4中出现两次。如果生成2个匹配项也没关系,因为列表可以映射到一个集合,然后返回到列表

但太慢了,因为我的真实单词terms列表和strs系列要大得多。有办法加快速度吗?

您可以尝试:

strs.str.findall('(?i){}'.format('|'.join([rf'b{i}b' for i in terms]))).map(set)
0    {word1, word3}
1                {}
2           {word2}
3                {}

或者为了维持秩序:

(strs.str.findall('(?i){}'.format('|'.join([rf'b{i}b' for i in terms])))
.map(lambda x: [*dict.fromkeys(x).keys()]))
0    [word3, word1]
1                []
2           [word2]
3                []

最新更新