You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python pandas提取列首尾冒号间内容创建DataFrame新列

pandas 提取字符串首尾冒号间内容生成新列

问题背景

需要对pandas DataFrame做列派生:从现有crate列中提取第一个冒号与最后一个冒号之间的内容,生成新列main_cr,最终输出列顺序为site、stat、main_cr、crate。

原始数据样例:

site        stat    crate   
AA - site 1 ok      AD1:00:AB5.30:100   
AA - site 1 ok      AD1:00:AB5.30:111   
A1 - site 2 fail    AD1:00:AB5.30:200   
AA - site 1 ok      AD1:00:AB5.30:555   
BB - site 8 fail    BB5:01:BA8.40:777   

预期输出:

site        stat    main_cr     crate
AA - site 1 ok      00:AB5.30   AD1:00:AB5.30:100
AA - site 1 ok      00:AB5.30   AD1:00:AB5.30:111
A1 - site 2 fail    00:AB5.30   AD1:00:AB5.30:200
AA - site 1 ok      00:AB5.30   AD1:00:AB5.30:555
BB - site 8 fail    01:BA8.40   BB5:01:BA8.40:777   

之前尝试的写法返回值不符合预期:

df['main_cr'] = df['crate'].str.split(':').str[1:3]

该写法返回的是['00', 'AB5.30']格式的列表,而非拼接完成的带冒号字符串,且写死切片位置的方式兼容性差。

实现方案

方案1:split切片后拼接(逻辑简单易读)

按冒号分割字符串后,切掉首尾两段(即第一个冒号前、最后一个冒号后的内容),剩余分段用冒号重新拼接即可,不需要写死切片位置,对不同分段长度的字段兼容性更好:

# 生成目标新列
df['main_cr'] = df['crate'].str.split(':').str[1:-1].str.join(':')
# 调整列顺序匹配输出要求
df = df[['site', 'stat', 'main_cr', 'crate']]

方案2:正则提取(代码简洁,大数据量下性能更优)

通过正则捕获组直接匹配目标区间内容,一步完成提取:

df['main_cr'] = df['crate'].str.extract(r'^.*?:(.*):.*?$')
df = df[['site', 'stat', 'main_cr', 'crate']]

正则逻辑说明:

  • ^.*?: 非贪婪匹配字符串开头到第一个冒号的内容
  • (.*) 贪婪匹配两个冒号之间的所有内容,自动定位到最后一个冒号前的位置,也就是我们需要提取的部分
  • :.*?$ 匹配最后一个冒号到字符串结尾的内容

两种方案运行后都能完全匹配预期输出效果,可根据个人习惯选择。

内容的提问来源于stack exchange,提问作者Lynn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 15:51:22