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

如何在Pandas中从Sample ID列提取内容生成新列?

Pandas DataFrame文本提取解决方案

问题分析

你的原有正则存在两处问题:

  • 用\d+\d+无法匹配带小数点的深度值(如0.5),也没考虑整数深度的情况
  • 未针对B/TP-1这类样本ID结构设计捕获逻辑

假设你的Sample ID列字符串格式类似B/TP-1-0.5、B/TP-6-2(样本ID与深度用连字符分隔),以下是两种可行的解决方法:

方法一:Pandas原生str.extract(推荐)

用str.extract可以一次性提取两列,代码更简洁高效:

import pandas as pd

# 定义正则模式,两个捕获组分别对应样本ID和深度值
pattern = r'(B/TP-\d+)-(\d+(\.\d+)?)'
# 直接提取到新列
SAMPDATA_w[['样本ID', '深度值']] = SAMPDATA_w['Sample ID'].str.extract(pattern)

# 将深度值转为数值类型(方便后续计算)
SAMPDATA_w['深度值'] = pd.to_numeric(SAMPDATA_w['深度值'], errors='coerce')

方法二:修复apply+re实现

如果你习惯用apply结合正则,可按以下方式修改:

import re
import pandas as pd

# 提取样本ID
SAMPDATA_w['样本ID'] = SAMPDATA_w['Sample ID'].apply(
    lambda x: re.search(r'(B/TP-\d+)', x).group(1) if re.search(r'(B/TP-\d+)', x) else None
)

# 提取深度值(兼容整数和小数)
SAMPDATA_w['深度值'] = SAMPDATA_w['Sample ID'].apply(
    lambda x: re.search(r'-(\d+(\.\d+)?)', x).group(1) if re.search(r'-(\d+(\.\d+)?)', x) else None
)
# 转换为数值类型
SAMPDATA_w['深度值'] = pd.to_numeric(SAMPDATA_w['深度值'], errors='coerce')

关键正则说明

  • (B/TP-\d+):捕获B/TP-开头加数字的样本ID部分
  • (\d+(\.\d+)?):匹配整数(如2)或小数(如0.5),?表示小数点及后续数字是可选的
  • pd.to_numeric:将提取的字符串转为数值,errors='coerce'会把无效值转为NaN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 07:17:45