CSV特殊格式数据处理规范及方案咨询:含空格、误差值等场景
Hey,针对你处理CSV数据的需求,我整理了清晰的处理准则和最优实现建议,帮你高效完成数据清洗:
处理准则
- 数值格式化与转换:先去除元素首尾空格,再转换为浮点型数值(注意不是
int(),因为你的数据包含小数); - 误差值提取规则:若元素末尾带有
(n)格式内容,括号内的数字对应数值最后一位的误差(比如46.0213(3)的误差为0.0003),无括号则误差赋值为NaN; - 无数据标记处理:元素为
--时,数值和误差均设为NaN; - 多值场景处理:若元素是
x or y格式,仅保留第一个值x,再按上述规则处理。
最优方案建议
修正CSV读取逻辑:你当前代码里的
quotechar='('会导致解析错误——括号并不是CSV字段的包裹符号,建议去掉这个参数,改用默认配置读取。另外,提取第5列(索引4)时,用列表推导式替代转置操作更高效易读:with open('data.txt', 'r') as fp: reader = csv.reader(fp, delimiter=',') column_I_want = [row[4] for row in reader]正则表达式统一解析:用正则一次性匹配数值和误差是最简洁的处理方式,推荐的正则模式可以覆盖所有你提到的场景:
import re # 匹配数值、可选误差、可选or后缀的正则 pattern = re.compile(r'^\s*(?P<num>[0-9.]+)(?:\((?P<err>\d+)\))?\s*(?:or.*)?$')这个表达式会自动忽略首尾空格、
or后面的冗余内容,同时捕获数值和误差数字。批量处理字段逻辑:遍历列数据,逐个匹配正则并生成结果:
- 遇到
--直接赋值NaN; - 匹配成功时,将捕获的
num转为float;误差部分根据数值的小数位数计算实际误差(比如数值105.8的小数位是1,误差数字4对应0.4); - 极端匹配失败的情况,也赋值
NaN避免报错。
- 遇到
大数据量用Pandas简化:如果数据量较大,用Pandas可以大幅简化代码,一行完成批量提取和转换:
import pandas as pd df = pd.read_csv('data.txt', usecols=[4], header=None) # 提取数值和误差字符串 df[['value', 'err_str']] = df[4].str.extract(r'^\s*([0-9.]+)(?:\((\d+)\))?\s*(?:or.*)?$') # 转换数值类型,无效值设为NaN df['value'] = pd.to_numeric(df['value'], errors='coerce') # 计算实际误差值 df['error'] = df.apply( lambda row: float(row['err_str']) * 10**(-len(str(row['value']).split('.')[1])) if pd.notna(row['err_str']) and pd.notna(row['value']) else pd.NA, axis=1 ) # 转为目标列表 values = df['value'].tolist() errors = df['error'].tolist()
内容的提问来源于stack exchange,提问作者Py-ser
相关产品推荐
相关产品推荐

