散点图绘制触发TypeError:'value'需为str/bytes类型而非float
问题解决:读取CSV绘制散点图触发TypeError及后续线性回归任务完成
问题重现
运行Python代码读取CSV绘制散点图时,触发TypeError: 'value' must be an instance of str or bytes, not a float,相关代码、CSV内容及报错信息如下:
原代码
import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt df = pd.read_csv('prehistoric_pueblos.csv', header=None, names=['X', 'y']) X = df['X'] y = df['y'] plt.scatter(X, y) plt.ylabel('y') plt.xlabel('X') plt.show()
CSV内容
1000,105; 1125,115; 1087,1213; 1070,1275; 1100,13; 1150,13; 1250,14; 1150,14; 1100,125; 1350,183; 1275,135; 1375,145; 1175,13; 1200,13; 1175,1275; 1300,1375; 1260,1285; 1330,14; 1325,14; 1200,1285; 1225,1275; 1090,1135; 1075,125; 1080,1275; 1080,115; 1180,125; 1225,1275; 1175,1225; 1250,128; 1250,13; 750,125; 1125,1175; 700,13; 900,125; 900,13; 850,12; ;
报错堆栈
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[45], line 16 13 X = df['X'] 14 y = df['y'] ---> 16 plt.scatter(X, y) 17 plt.ylabel('y') 18 plt.xlabel('X') File c:\Program Files\Python311\Lib\site-packages\matplotlib\pyplot.py:2862, in scatter(x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, edgecolors, plotnonfinite, data, **kwargs) 2857 @_copy_docstring_and_deprecators(Axes.scatter) 2858 def scatter( 2859 x, y, s=None, c=None, marker=None, cmap=None, norm=None, 2860 vmin=None, vmax=None, alpha=None, linewidths=None, *, 2861 edgecolors=None, plotnonfinite=False, data=None, **kwargs): -> 2862 __ret = gca().scatter( 2863 x, y, s=s, c=c, marker=marker, cmap=cmap, norm=norm, 2864 vmin=vmin, vmax=vmax, alpha=alpha, linewidths=linewidths, 2865 edgecolors=edgecolors, plotnonfinite=plotnonfinite, 2866 **({"data": data} if data is not None else {}), **kwargs) 2867 sci(__ret) 2868 return __ret File c:\Program Files\Python311\Lib\site-packages\matplotlib\__init__.py:1461, in _preprocess_data..inner(ax, data, *args, **kwargs) 1458 @functools.wraps(func) ... 96 ", ".join(names[:-1]) + " or " + names[-1] 97 if len(names) > 1 else names[0], 98 type_name(type(v)))) TypeError: 'value' must be an instance of str or bytes, not a float
错误原因
CSV文件每行结尾带有分号;,导致pandas读取时将y列识别为包含分号的字符串类型,同时最后一行的空数据;引入了NaN值,混合类型的数组传入plt.scatter()时触发类型错误。
修复及完整任务代码
以下代码修复了CSV读取问题,并完成拆分数据集、训练线性回归、绘制带回归线的散点图、计算评估指标的全部任务:
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 读取并清洗CSV数据 df = pd.read_csv('prehistoric_pueblos.csv', header=None, names=['X', 'y'], sep=',') # 去除y列的分号并转换为数值类型 df['y'] = df['y'].str.strip(';').astype(float) # 删除包含空值的行 df = df.dropna(subset=['X', 'y']) # 分离特征与目标变量(线性回归要求X为二维数组) X = df[['X']] y = df['y'] # 拆分数据集:15%测试集,85%训练集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15, random_state=42) # 训练线性回归模型 model = LinearRegression() model.fit(X_train, y_train) # 预测测试集结果 y_pred = model.predict(X_test) # 绘制含回归直线的散点图 plt.figure(figsize=(10,6)) # 原始数据散点 plt.scatter(X, y, color='blue', label='原始数据') # 回归直线 plt.plot(X, model.predict(X), color='red', linewidth=2, label='回归直线') plt.xlabel('X') plt.ylabel('y') plt.title('散点图与线性回归直线') plt.legend() plt.show() # 计算评估指标 mse = mean_squared_error(y_test, y_pred) r2 = r2_score(y_test, y_pred) print(f"测试集均方误差(MSE): {mse:.2f}") print(f"测试集R²得分: {r2:.2f}")
代码说明
- 数据清洗:通过
str.strip(';')移除y列的分号,astype(float)转换为数值类型,dropna删除无效空行; - 数据集拆分:使用
train_test_split按15%比例拆分,random_state保证结果可复现; - 模型训练:调用
LinearRegression拟合训练数据; - 可视化:同时绘制原始散点和回归直线;
- 指标计算:用
mean_squared_error和r2_score计算测试集的MSE和R²值。
内容的提问来源于stack exchange,提问作者DigoDMe
相关产品推荐
相关产品推荐

