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

sklearn线性回归场景下np数组移除NaN值的索引报错如何解决

问题解决:NumPy数组NaN值过滤与线性回归正确实现

错误根源

  • 你当前的mask逻辑完全错误:首先你定义的x是固定年份数组,本身不存在NaN值,缺失值仅出现在y数组中;其次x[~pd.isna(x)]返回的是x的数值而非布尔掩码,两个数值数组做&运算得到的仍为数值类型,无法作为索引使用,因此抛出类型错误。
  • sklearn的LinearRegression本身不会自动将NaN转为0,你遇到的0值问题大概率是读入CSV时空值被默认填充为0,或是提取y数组的过程中空值被转换为0。如果读入阶段空值就被转成0,后续过滤NaN的逻辑不会生效,需要先修正读入逻辑。

正确实现代码

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression

munilist = ["Adjuntas", "Anasco", "Ciales", "Jayuya", "Lares", "LasMarias", "Maricao", "Mayaguez", "Orocovis", "Penuelas", "Ponce", "SabanaGrande", "SanGerman", "SanSebastian", "Utuado", "Yauco"]
# 固定年份数组提前定义,无需放在循环内重复生成
x_all = np.array([1987, 1992, 1998, 2002, 2007, 2012]).reshape(-1, 1)

for municipality in munilist:
    # 提取对应行政区的y值
    y = np.array(df[df["Municipio"]==municipality].iloc[0, 1:7]).reshape(-1, 1)
    # 生成布尔掩码:保留y值非NaN的位置,flatten将二维布尔数组转为一维方便索引
    mask = ~pd.isna(y).flatten()
    # 过滤得到有效样本对
    x_valid = x_all[mask]
    y_valid = y[mask]
    
    # 可选判断:有效样本数≥2才能正常拟合线性回归,避免报错
    if len(x_valid) < 2:
        # 可根据业务逻辑自行处理样本不足的情况,这里示例直接跳过
        continue
    
    xlin = np.arange(1987, 2013, 1) # 待预测的年份区间
    reg = LinearRegression(fit_intercept=True).fit(x_valid, y_valid)
    a0 = reg.intercept_
    a1 = reg.coef_[0]

额外注意事项

  • 读入CSV时要确保空值被正确识别为NaN,可在pd.read_csv中指定参数:df = pd.read_csv("你的文件路径.csv", na_values=["", " "]),将空字符串、空格均识别为空值。
  • 如果需要对缺失值做填充而非直接丢弃,可使用df.fillna()等方法提前完成填充,再进行拟合。

内容的提问来源于stack exchange,提问作者Francis Russell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:45:11