Python脚本报错:无法在数组中找到索引,求问题根源
问题根源分析与解决方案
首先咱们来拆解这个「无法在数组中找到索引」错误的核心原因:
你用train_test_split拆分数据集后,X_train作为DataFrame,它的索引会保留原数据集的索引值,并不是从0开始的连续整数序列。但你的循环里用了for n in range(0, len(Y_train)),也就是用0、1、2...这类连续数字去取X_train["surface"][n],当这个n不在X_train的实际索引集合里时,自然就会触发索引找不到的错误。
举个直观的例子:假设原数据集的索引是[2,5,7,10,...],拆分后的X_train索引还是这些零散的值,当循环到n=0时,X_train里根本没有0这个索引,程序直接报错。
解决方法
方法1:重置X_train和Y_train的索引
在拆分数据集后,给X_train和Y_train重置索引,让它们从0开始连续编号:
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2) # 重置索引,drop=True避免把原索引转为新列 X_train = X_train.reset_index(drop=True) Y_train = Y_train.reset_index(drop=True) # 后续代码保持不变 est = sm.OLS(Y_train, X_train).fit() coefSurface = est.params["surface"] coefArrondissement = est.params["arrondissement"] ...
这样循环里的n就能和X_train的索引完美对应,不会再出现索引不匹配的问题。
方法2:改用更高效的向量运算(推荐)
Pandas和Statsmodels本身就支持向量式运算,完全没必要写循环——这种方式既高效,又从根源上规避了索引问题:
# 直接通过列运算计算预测价格 predicted_prices = coefSurface * X_train["surface"] + coefArrondissement * X_train["arrondissement"] # 想查看结果的话,直接打印整个Series即可 print(predicted_prices)
这是Pandas的惯用写法,比循环执行速度快得多,也更符合数据分析的代码风格。
另外提个小建议:你代码里的indices和indices2看起来是想过滤值为"whatever"的行,如果这类无效数据存在,建议在拆分数据集前就完成数据清洗,不然带着无效特征训练模型,会直接影响模型的拟合效果哦。
内容的提问来源于stack exchange,提问作者eldondano
相关产品推荐
相关产品推荐

