如何在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
相关产品推荐
相关产品推荐

