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

循环遍历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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:21:21