猿问

在 pandas 数据框列上使用 rsplit 基于分隔符的第二个实例进行分隔

我有一列熊猫数据框,我想根据分隔符的第二个实例将其拆分并扩展为新的数据框。我根据分隔符的最后一个实例进行拆分,但不幸的是,在大约 80k 行中有少数实例有 4 个“_”而不是 3 个。


例如,我有一个包含多列的数据框,其中我想拆分为新数据框的列如下所示:


df.head()


   gene

0  NM_000000_foo_blabla

1  NM_000001_bar

我想拆分和扩展它,使其分开:


(需要)


df2.head()


   col1          col2

0  NM_000000     foo_bar

1  NM_000001     foo

在使用我当前的代码时:


df2 = df['gene'].str.rsplit('_', 1, expand=True).rename(lambda x: f'col{x + 1}', axis=1) 

我明白了:


(实际的)


df2.head()


   col1          col2

0  NM_000000_foo bar

1  NM_000001     foo

有没有一种简单的方法来实现这个我修改我已经在使用的代码行?我尝试使用 rsplit 中的拆分数量,但无法达到我想要的结果。谢谢!


婷婷同学_
浏览 168回答 2
2回答

慕田峪7331174

由于您的数据似乎定义得相当好,您可以使用正则表达式提取分隔符的第二个实例。df['gene'].str.extract(r'(?:[^_]+_){2}(.*)')            00  foo_blabla1         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))            00  foo_blabla1         bar>>> df['gene'].str.extract(build_regex('_', 3))        00  blabla1     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}(.*)

catspeake

只需将 2nd 替换'_'为您的自定义分隔符split即可df.gene.str.replace(r'([^_]+_[^_]+)_', r'\1|').str.split('|', expand=True)Out[488]:           0           10  NM_000000  foo_blabla1  NM_000001  bar 
随时随地看视频慕课网APP

相关分类

Python
我要回答