循环遍历DataFrame计算递增行R2报错:numpy.float64无values属性
报错根因
代码存在4处逻辑/写法问题,直接触发报错的是第一点:
- 取值对象类型错误:
df['a'].loc[0+n]是通过行标签取单个单元格的标量值(类型为numpy.float64),并非pandas Series对象,因此不存在.values属性。循环外直接对整列df['a'](Series类型)调用.values自然可以正常运行。 - 计数器逻辑失效:每次for循环内部都执行
n=0重置计数,即使修复取值错误,也永远只能取到第0行的数据,无法实现「子集行数逐行递增」的需求。 - 数组维度不匹配:构造X时用
np.ones(len(df))生成的是和全表长度一致的数组,和递增子集的长度不匹配,后续拟合时会触发维度错误。 - 无效拟合场景:循环第一轮仅取1行样本,样本量小于特征数(带截距共2个特征),线性回归模型无法正常拟合。
修正后可运行代码
import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression import matplotlib.pyplot as plt df = pd.DataFrame() a = [1, 1.5, 2, 4, 5, 6, 7, 8, 9, 10] b = [2, 4, 6, 7, 8, 9, 10, 11, 12, 13] df['a'] = a df['b'] = b print(df) plt.scatter(x=df['a'], y=df['b']) lr = LinearRegression() # 从至少2个样本开始遍历,逐次扩大子集到全部数据 for end_idx in range(2, len(df)+1): # 取从第0行到end_idx-1行的递增子集 sub_df = df.iloc[:end_idx] # 构造特征:截距项 + 自变量a,长度和当前子集一致 X = np.column_stack([ np.ones(len(sub_df), dtype=np.float32), sub_df['a'].values ]) y = sub_df['b'].values model = lr.fit(X, y) r2 = model.score(X, y) print(f'前{end_idx}行数据拟合的R Squared: {r2:.4f}') plt.show()
关键修正点
- 改用
iloc[:end_idx]做行切片,直接生成从2行到全表的逐次增量子集,不需要额外维护计数器,逻辑更简洁。 - 所有特征、标签数组的长度都基于当前子集计算,避免维度不匹配问题。
- 迭代从2个样本的子集开始,跳过无法拟合的单样本场景。
- 对子集整列(Series类型)调用
.values转换为numpy数组,符合方法调用的对象类型要求。
内容的提问来源于stack exchange,提问作者Daniel Rodelli
相关产品推荐
相关产品推荐

