gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:36:35 24 4
gpt4 key购买 nike

我有一个 pandas 数据框的列,我想根据分隔符的第二个实例将其拆分并扩展为一个新的数据框。我是根据分隔符的最后一个实例进行拆分的,但不幸的是,在 ~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 中使用拆分数,但无法达到我想要的结果。谢谢!

最佳答案

由于您的数据似乎定义得相当好,您可以使用正则表达式提取分隔符的第二个实例。

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

关于python - 在 pandas 数据框列上使用 rsplit 根据分隔符的第二个实例进行分隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57776828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com