Python pandas构建线性回归时报#DIV/0!转float的ValueError
报错原因说明
触发ValueError: could not convert string to float: '#DIV/0!'的核心原因,和你感知的“所有涉及列均为浮点数存储”存在实际误差:
#DIV/0!是Excel导出csv时自动生成的公式错误占位符,对应表格里做除法计算时分母为0的失败单元格,本质是纯文本字符串,不是有效数值- 只要某一列里混入哪怕1个这类字符串,pandas读入csv时就不会把该列识别为float数值类型,会整体存为object字符串类型
- 你在Excel里看到的“浮点数存储类型”是单元格的预设格式,不是单元格实际的存储值——带
#DIV/0!的单元格哪怕预设格式是浮点数,导出csv后实际写入文件的也是错误文本串 - sklearn拟合线性回归时,会强制把所有输入特征转换为浮点类型做矩阵运算,碰到这类无法转成数字的字符串就会直接抛出类型转换错误
可落地的解决方案
- 第一步:读入csv时主动指定需要识别为缺失值的Excel常见错误占位符,避免把错误字符串读成有效数据
import pandas as pd # 读入时配置缺失值识别规则,覆盖所有常见Excel导出错误值 trans = pd.read_csv( "steam3.csv", na_values=["#DIV/0!", "#N/A", "#VALUE!", "#REF!"] ) - 第二步:校验建模所用列的实际数据类型,确认没有残留字符串值
# 打印列的实际存储类型,确认三个列均为int/float数值类型 print(trans[["price", "positive_ratings", "c.owners"]].dtypes) - 第三步:清洗建模所用的缺失值,避免后续拟合时报空值错误
可以直接删除建模相关列存在缺失的行,简单适配线性回归的输入要求:# 提取建模用的子集,删除存在缺失值的行 model_dataset = trans[["price", "positive_ratings", "c.owners"]].dropna() # 拆分特征和预测目标 y = model_dataset["price"] x = model_dataset[["positive_ratings", "c.owners"]] - 第四步:重新运行线性回归拟合代码即可正常运行
from sklearn import linear_model mymodel = linear_model.LinearRegression() mymodel.fit(x, y) print(mymodel.coef_)
注意:不要跳过缺失值处理步骤直接拟合,哪怕把
#DIV/0!转成了缺失值,存在NaN的输入同样无法被sklearn的线性回归接口接受,会抛出新的空值输入报错。
内容的提问来源于stack exchange,提问作者Needhelp
相关产品推荐
相关产品推荐

