如何将CSV中格式异常的字符串数据转为浮点数(Pandas读取)
解决CSV读取时数值带引号与逗号小数分隔导致的类型不统一问题
问题现状
执行以下代码读取CSV文件:
U_d = pd.read_csv("Uzud.csv", decimal = ',') print(U_d)
得到输出:
f in kHz U in mV Amplitude in Vpp entfernung in cm 43.7 52 1 5.0 9.0 43.7 43 5 11.0 NaN 43.7 30 5 13.0 NaN 43.7 27,5 5 15.0 NaN 43.7 24 5 16.0 NaN
原始CSV文件内容:
f in kHz,U in mV,amplitude in Vpp,distance in cm "43,7",52,1,5,9 "43,7",43,5,11 "43,7",30,5,13 "43,7", "27,5",5,15 "43,7",24,5,16
问题核心:部分数值带引号、使用逗号作为小数分隔符,同时存在单元格前导空格,导致U in mV列中27,5被识别为字符串,所有列实际应为浮点数类型,需统一转换。
解决方案
方法1:读取阶段直接处理
利用pandas和csv模块的参数,在读取时完成数值解析:
import pandas as pd import csv U_d = pd.read_csv( "Uzud.csv", decimal=',', quoting=csv.QUOTE_NONNUMERIC, skipinitialspace=True ) # 验证列类型 print(U_d.dtypes)
quoting=csv.QUOTE_NONNUMERIC:将带引号的内容自动解析为数值类型,配合decimal=','正确转换43,7、27,5为浮点数skipinitialspace=True:去除单元格内的前导空格,避免带空格的数值(如"27,5")解析失败
方法2:读取后批量转换
如果已读取到混合类型的DataFrame,可通过pd.to_numeric强制统一类型:
import pandas as pd # 先读取文件,保留原始格式 U_d = pd.read_csv("Uzud.csv", decimal=',', skipinitialspace=True) # 遍历所有列,转换为浮点数,无法转换的值设为NaN for col in U_d.columns: U_d[col] = pd.to_numeric(U_d[col], errors='coerce') # 验证结果 print(U_d) print(U_d.dtypes)
pd.to_numeric(..., errors='coerce'):自动将字符串格式的数值转换为浮点数,无法转换的内容转为NaN,确保列类型统一为float64
内容的提问来源于stack exchange,提问作者T.Stark
相关产品推荐
相关产品推荐

