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

Python pandas基于DataFrame现有列提取指定模式生成新列

Pandas 字段提取问题解决方案

需求说明

需要基于DataFrame的现有crate列创建新列main_cr,取值规则为:提取crate列值中第一个冒号之后、最后一个冒号之前的内容(不包含首尾冒号)。

原始数据

site        stat    crate   
JJ - site 1 ok      JD1:0055:AB5.30:100 
JJ - site 1 ok      JD1:00AB:AB5.30:111 
J1 - site 2 fail    JD1:00AA:AB5.30:200 
JJ - site 1 ok      JD1:00A:AB5.30:555  
CC - site 8 fail    CC5:01AAA:BA8.40:777    

期望输出

site        stat    main_cr        crate
JJ - site 1 ok      0055:AB5.30    JD1:0055:AB5.30:100
JJ - site 1 ok      00AB:AB5.30    JD1:00AB:AB5.30:111
J1 - site 2 fail    00AA:AB5.30    JD1:00AA:AB5.30:200  
JJ - site 1 ok      00A:AB5.30     JD1:00A:AB5.30:555
CC - site 8 fail    01AAA:BA8.40   CC5:01AAA:BA8.40:777 

现存问题

当前尝试的正则代码存在语法错误、匹配范围过窄的问题,无法得到正确结果:

df['main_cr']=df['crate'].str.extract(r':(\d):.*):')

具体错误点:

  • 正则括号不配对,语法不合法
  • \d仅能匹配单个数字,无法覆盖目标内容中的字母、点号、多段冒号分隔的文本
  • 没有锚定字符串首尾位置,容易出现匹配错位

正确实现代码

使用正则锚定首尾结构,捕获第一个冒号到最后一个冒号之间的所有内容即可:

import pandas as pd

# 提取目标内容
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 16:03:34