Python DataFrame列选择及预测阶段报错问题求助
看起来你遇到的问题是由于索引不匹配导致的,虽然你确认三个变量的长度都是382,但它们的索引可能完全不同,导致pandas在创建DataFrame时尝试对齐索引,从而引发长度不匹配的错误。让我一步步帮你分析和解决:
首先,先确认实际长度(排除误判)
先在创建Newdf之前,打印三个变量的实际长度,确保你的判断是正确的:
print("Names length:", len(Names)) print("ActualAttendance length:", len(ActualAttendance)) print("y_load_predit length:", len(y_load_predit))
如果输出的长度不一致,那问题就出在这里——比如你可能在预测时误使用了训练拆分后的X_test(长度是总数据的20%,即382*0.2≈77)而不是完整的数据集,这会直接导致y_load_predit长度为77,和其他两个变量的382不匹配,正好对应你看到的77和459的错误(459可能是索引对齐后的行数)。
核心问题:索引对齐冲突
假设三个变量长度确实都是382,那问题大概率出在索引不匹配上:
Names = df.reset_index(drop=False)['students']:这行代码会把原来的索引(那些长字符串,比如5c48943cbe8e95292564e163)转换成一列,同时生成新的从0开始的整数索引。所以Names的索引是0,1,...,381。ActualAttendance = dataset['OverallAtt']:这个Series的索引还是原来的长字符串索引,和Names的索引完全没有交集。y_load_predit是numpy数组,没有索引,当放入DataFrame时会自动使用从0开始的整数索引。
当pandas创建DataFrame时,会尝试对齐所有Series的索引,由于Names和ActualAttendance的索引没有交集,最终生成的DataFrame行数会是两者索引的并集大小(可能远大于382),但y_load_predit的长度还是382,就会引发长度不匹配的错误。
快速解决方案
方案1:忽略索引,直接使用值数组
创建DataFrame时,使用.values获取变量的原始值数组,跳过索引对齐步骤:
Newdf = pd.DataFrame({ 'Full Name': Names.values, 'Actual Attendance': ActualAttendance.values, 'Predicted Attendance': y_load_predit })
这样pandas会自动生成连续的整数索引,不会再因为索引不匹配导致行数异常。
方案2:保持索引一致(推荐)
既然students是原来的索引(从你之前的KeyError: 'students'可以推断,它不是列名而是索引名),你可以直接从索引获取Names,保持和ActualAttendance的索引一致:
# 直接把索引转换成Series,保留原索引 Names = df.index.to_series(name='Full Name') # 然后创建DataFrame Newdf = pd.DataFrame({ 'Full Name': Names, 'Actual Attendance': ActualAttendance, 'Predicted Attendance': y_load_predit })
这样三个部分的索引完全匹配,pandas可以正常对齐,不会出现长度问题。
额外检查
还要确保训练和预测时的特征完全一致:比如训练时X是去掉OverallAtt后的列,预测时的NewX_test也要保证有相同的列数和列名,否则模型预测时会报错(不过你的错误是创建DataFrame时的,所以这个是次要检查)。
内容的提问来源于stack exchange,提问作者user12559668

