Python从Pandas DataFrame列中提取连字符分隔的深度数值问题
解决Pandas Depth列提取第二个数值的问题
我来帮你搞定这个Depth列第二个数值提取失败的问题!咱们先从最简洁高效的方案入手,再分析你之前尝试里的问题所在。
最优解决方案:一次性提取两个数值
直接用带双捕获组的正则表达式,通过str.extract一次性把DepthFrom和DepthTo都提取出来,这是Pandas处理这类字符串拆分的标准做法:
import pandas as pd # 读取并初始化数据 ConvCore = pd.read_csv(r'ConvCore.csv', encoding='cp1252') ConvCore.columns = ['Depth', 'k', 'phi', 'Well'] # 用正则一次性匹配两个数值,自动拆分成两列 ConvCore[['DepthFrom', 'DepthTo']] = ConvCore['Depth'].str.extract(r'(\d+\.?\d*)-(\d+\.?\d*)', expand=True) # 转为浮点类型(根据需求可选,方便后续数值计算) ConvCore['DepthFrom'] = ConvCore['DepthFrom'].astype(float) ConvCore['DepthTo'] = ConvCore['DepthTo'].astype(float)
正则说明:
(\d+\.?\d*):匹配整数或小数(比如100、100.5都能匹配),第一个括号捕获DepthFrom,第二个捕获DepthTo-:匹配分隔用的连字符,如果你的数据里连字符前后有空格(比如100 - 200),把正则改成(\d+\.?\d*)\s*-\s*(\d+\.?\d*)即可
你之前尝试的问题分析
咱们来看看你之前的代码为什么没成功:
- 单独提取
DepthTo时用'-([0-9.]+)':如果你的Depth字段里连字符前后有空格(比如100 - 200),这个正则就匹配不到,需要加上空格匹配'-\\s*([0-9.]+)' - 用
re.search循环的方式:re.search是处理单个字符串的函数,不能直接作用于Pandas Series,而且循环逻辑也有问题(for i in ConvCore遍历的是列名,不是行索引) - 用
str.split("-")之后没取第二个元素:如果用split,应该写成ConvCore['DepthTo'] = ConvCore['Depth'].str.split("-", expand=True)[1],但要注意如果有多个连字符,加上n=1参数只拆分一次:str.split("-", n=1, expand=True)[1]
处理特殊格式的情况
如果你的Depth列存在格式不统一的情况(比如多余空格、非标准分隔符),可以先做数据清洗:
# 去除前后空格,把连字符前后的空格统一替换成纯连字符 ConvCore['Depth'] = ConvCore['Depth'].str.strip().str.replace(r'\s*-\s*', '-', regex=True)
内容的提问来源于stack exchange,提问作者Rajesh Bagaria
相关产品推荐
相关产品推荐

