我有一个系列,其中每个元素都是一个空列表:
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 []