用pandas搜索并返回匹配子串的索引

Sha*_* Gc 4 python string series pandas

我想扩展这里提出的问题

上述问题中的解决方案返回 True 或 False。布尔值可用于对正确值进行子集化。

但是,我想获取与子字符串匹配的搜索值。

例如,(借用上面的问题)

s = pd.Series(['cat','hat','dog','fog','pet'])
searchfor = ['og', 'at']
Run Code Online (Sandbox Code Playgroud)

我想知道 'cat' 与 'at' 匹配,dog 与 'og' 匹配

cs9*_*s95 5

IIUC,您希望这些值反映列表中与您的单词匹配的项目的索引searchfor。您可以从修改searchfor对象开始-

m = {'^.*{}.*$'.format(s) : str(i) for i, s in enumerate(searchfor)}
Run Code Online (Sandbox Code Playgroud)

这是一个<pattern : index>映射字典。现在,打电话pd.Series.replace给regex=True-

s = s.replace(m, regex=True)
s[:] = np.where(s.str.isdigit(), pd.to_numeric(s, errors='coerce'), -1)
Run Code Online (Sandbox Code Playgroud)

s

0    1
1    1
2    0
3    0
4   -1
dtype: int64
Run Code Online (Sandbox Code Playgroud)

如果您想要按模式匹配的值列表,则需要str.extract+ groupby+ apply-

p = '(^.*({}).*$)'.format('|'.join(searchfor))

s.str.extract(p, expand=True)\
 .groupby([1])[0]\
 .apply(list)

1
at    [cat, hat]
og    [dog, fog]
Name: 0, dtype: object
Run Code Online (Sandbox Code Playgroud)