2 回答
TA贡献1828条经验 获得超13个赞
由于您的数据似乎定义得相当好,您可以使用正则表达式提取分隔符的第二个实例。
df['gene'].str.extract(r'(?:[^_]+_){2}(.*)')
0
0 foo_blabla
1 bar
您可以将其概括为任何分隔符,并使用一个简单的函数将其匹配任意次数:
def build_regex(delimiter, num_matches=1):
return rf'(?:[^{delimiter}]+{delimiter}){{{num_matches}}}(.*)'
>>> build_regex('_', 2)
'(?:[^_]+_){2}(.*)'
>>> df['gene'].str.extract(build_regex('_', 2))
0
0 foo_blabla
1 bar
>>> df['gene'].str.extract(build_regex('_', 3))
0
0 blabla
1 NaN
正则表达式解释
(?: # non capture group
[^_]+ # match anything but _ one or more times
_ # match _
){2} # match this group 2 times
( # start of capture group 1
.* # match anything greedily
) # end of matching group 1
如果在前两个分隔符之前不能保证有文本,您还可以使 not 断言匹配 0 次或更多次:
(?:[^_]*_){2}(.*)
TA贡献1111条经验 获得超0个赞
只需将 2nd 替换'_'为您的自定义分隔符split即可
df.gene.str.replace(r'([^_]+_[^_]+)_', r'\1|').str.split('|', expand=True)
Out[488]:
0 1
0 NM_000000 foo_blabla
1 NM_000001 bar
添加回答
举报