You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

散点图绘制触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:44:50