为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

婷婷同学_ 2022-05-19 16:19:46
我有一列熊猫数据框,我想根据分隔符的第二个实例将其拆分并扩展为新的数据框。我根据分隔符的最后一个实例进行拆分,但不幸的是,在大约 80k 行中有少数实例有 4 个“_”而不是 3 个。例如,我有一个包含多列的数据框,其中我想拆分为新数据框的列如下所示:df.head()   gene0  NM_000000_foo_blabla1  NM_000001_bar我想拆分和扩展它,使其分开:(需要)df2.head()   col1          col20  NM_000000     foo_bar1  NM_000001     foo在使用我当前的代码时:df2 = df['gene'].str.rsplit('_', 1, expand=True).rename(lambda x: f'col{x + 1}', axis=1) 我明白了:(实际的)df2.head()   col1          col20  NM_000000_foo bar1  NM_000001     foo有没有一种简单的方法来实现这个我修改我已经在使用的代码行?我尝试使用 rsplit 中的拆分数量,但无法达到我想要的结果。谢谢!
查看完整描述

2 回答

?
慕田峪7331174

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}(.*)


查看完整回答
反对 回复 2022-05-19
?
catspeake

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 


查看完整回答
反对 回复 2022-05-19
  • 2 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信