代码运行出现KeyError:411,请求分析错误原因及解决方法
分析KeyError: 411的原因
这个错误的核心问题出在你对pandas Series的索引方式上:
- 你的
y是从DataFrame中取出的Series(data['y']),它的索引不一定是从0开始的连续整数。 - 而你在循环里用
k(从0到len(y_pred)-1的整数)去直接索引y[k],当k这个值不在y的索引列表里时,就会触发KeyError——比如这里的411,说明你的y的索引中没有411这个键。
修复方案
有两种简单的方式解决这个索引问题:
方案1:使用iloc按位置取值
把代码中访问y[k]的地方改成y.iloc[k],iloc是pandas中专门按**位置(从0开始的顺序)**取值的方法,不管原索引是什么:
my_dict = {} val = data['prob'] y = data['y'] for i in val: y_pred = [] FP = 0 FN = 0 for j in val: if (j >= i): y_pred.append(1) else: y_pred.append(0) for k in range(len(y_pred)): # 改成iloc按位置取值 if (y.iloc[k] == 1 and y_pred[k] == 0): FN += 1 elif (y.iloc[k] == 0 and y_pred[k] == 1): FP += 1 A = (500 * FN)+(100 * FP) my_dict[i] = A min(my_dict)
方案2:把y转换成普通列表
提前把y转换成Python列表,这样用整数索引就不会有问题:
my_dict = {} val = data['prob'] # 转换成列表 y = data['y'].tolist() for i in val: y_pred = [] FP = 0 FN = 0 for j in val: if (j >= i): y_pred.append(1) else: y_pred.append(0) for k in range(len(y_pred)): if (y[k] == 1 and y_pred[k] == 0): FN += 1 elif (y[k] == 0 and y_pred[k] == 1): FP += 1 A = (500 * FN)+(100 * FP) my_dict[i] = A min(my_dict)
额外优化建议
你的代码目前效率比较低:
for i in val会遍历prob列的每一个值,包括重复值,做很多重复计算。可以先对val去重,比如用val = data['prob'].unique(),减少循环次数。- 内层的
y_pred生成和FP/FN统计可以用pandas的向量化操作代替循环,大幅提升速度,比如:
val = data['prob'].unique() y = data['y'] my_dict = {} for i in val: y_pred = (data['prob'] >= i).astype(int) FN = ((y == 1) & (y_pred == 0)).sum() FP = ((y == 0) & (y_pred == 1)).sum() A = 500 * FN + 100 * FP my_dict[i] = A min(my_dict)
这种向量化的写法不仅更快,也更简洁,不容易出错。
内容的提问来源于stack exchange,提问作者Rajeev Srivastava
相关产品推荐
相关产品推荐

