Pandas读取CSV出现无法将字符串转换为浮点错误,如何跳过对应错误行
问题解决方案
你遇到的ValueError: could not convert string to float: 'ORCH'是字段内容不符合指定的数值类型导致的转换错误,error_bad_lines(该参数在pandas 2.0+版本已废弃,替换为on_bad_lines)仅用于跳过列数和表头不匹配的行,无法处理这类内容转换错误,可通过以下两种方案解决:
方案1:读入时通过自定义转换函数处理
自定义类型转换函数,遇到无法转换为对应类型的内容直接返回空值,读取完成后删除携带空值的异常行即可:
import pandas as pd import numpy as np # 安全浮点转换函数,转换失败返回空值 def safe_float(x): try: return float(x) except ValueError: return np.nan # 安全整型转换函数,转换失败返回空值 def safe_int(x): try: return int(x) except ValueError: return np.nan csv2020 = pd.read_csv( 'filename.txt', sep="\t", usecols=['field1', 'field2', 'field3', 'field4'], converters={ 'field1': safe_int, 'field2': safe_float, 'field3': safe_float, 'field4': safe_float } ).dropna(axis=0, how='any') # 删除所有存在转换失败的行
方案2:先读为字符串再批量转换(超大数据集性能更优)
避免逐行调用自定义函数的性能损耗,先统一读取为字符串格式,再批量做类型转换:
import pandas as pd # 先全部读取为字符串格式,避免读入阶段报错 csv2020 = pd.read_csv( 'filename.txt', sep="\t", usecols=['field1', 'field2', 'field3', 'field4'], dtype=str, on_bad_lines='skip' # 同时跳过列数不匹配的异常行 ) # 转换整型字段,转换失败自动设为空值 csv2020['field1'] = pd.to_numeric(csv2020['field1'], errors='coerce').astype('Int64') # 批量转换浮点型字段 for col in ['field2', 'field3', 'field4']: csv2020[col] = pd.to_numeric(csv2020[col], errors='coerce') # 删除异常行 csv2020 = csv2020.dropna(axis=0, how='any')
补充优化建议
- 处理1亿行量级的数据集时,可添加
chunksize参数分块读取,例如设置chunksize=100000每次读取10万行处理后再合并结果,避免内存溢出。
内容的提问来源于stack exchange,提问作者Tyler Moore
相关产品推荐
相关产品推荐

