DataFrame错误率分箱生成准确率分布列的代码问题排查
问题排查:准确率分布列计算不符合预期的原因及解决方案
先明确你的核心需求:基于Error_Rate推导对应的准确率区间列,其中准确率 = 100% - Error_Rate,对应区间规则如下:
- Above 90% 准确率 → Error_Rate ≤10
- 80% - 90% 准确率 → 10 < Error_Rate ≤20
- 65% - 80% 准确率 →20 < Error_Rate ≤35
- Below 65% 准确率 →Error_Rate >35
你的代码逻辑本身是自洽的,但大概率是以下问题导致结果不符合预期:
1. 数据类型错误(最可能的诱因)
如果你的Error_Rate列是字符串类型而非数值类型,数值比较会按照字符串字典序执行,完全打乱判断逻辑。比如字符串'3'和'10'比较时,'3' > '10'会返回True(因为首字符'3'的ASCII码大于'1'),这会让本应属于Above 90%的Error_Rate=10(字符串'10')被错误归类。
验证与修复步骤:
先检查列类型:
print(df['Error_Rate'].dtype)
如果输出是object(字符串类型),先转换为数值类型:
df['Error_Rate'] = pd.to_numeric(df['Error_Rate'], errors='coerce')
2. 嵌套np.where的可读性缺陷(潜在逻辑漏洞)
嵌套np.where虽然逻辑正确,但一旦符号写错(比如把>写成<),很难快速定位问题。更推荐用向量化条件赋值或pd.cut + 独热编码的方式,代码更简洁且不易出错。
优化后的代码
方式一:多条件直接赋值(可读性最高)
import pandas as pd import numpy as np # 初始化所有新增列为0 df[['Above 90%', '80% - 90%', '65% - 80%', 'Below 65%']] = 0 # 按区间逐个赋值 df.loc[df['Error_Rate'] <= 10, 'Above 90%'] = 1 df.loc[(df['Error_Rate'] > 10) & (df['Error_Rate'] <= 20), '80% - 90%'] = 1 df.loc[(df['Error_Rate'] > 20) & (df['Error_Rate'] <= 35), '65% - 80%'] = 1 df.loc[df['Error_Rate'] > 35, 'Below 65%'] = 1
方式二:pd.cut生成分类后转独热编码(最简洁)
# 定义错误率区间边界和对应准确率标签 bins = [-np.inf, 10, 20, 35, np.inf] labels = ['Above 90%', '80% - 90%', '65% - 80%', 'Below 65%'] # 生成准确率分类列 df['Accuracy_Category'] = pd.cut(df['Error_Rate'], bins=bins, labels=labels, right=True) # 转换为独热编码并合并到原表 df = pd.concat([df, pd.get_dummies(df['Accuracy_Category'], prefix='', prefix_sep='')], axis=1) # 可选:删除临时分类列 df.drop('Accuracy_Category', axis=1, inplace=True)
3. 验证结果
用你的示例数据运行优化后的代码,会得到完全符合预期的结果:
Company Error_Rate Above 90% 80% - 90% 65% - 80% Below 65% 0 A 9 1 0 0 0 1 B 10 1 0 0 0 2 c 20 0 1 0 0 3 GK 17 0 1 0 0 4 GK 18 0 1 0 0 5 GK 30 0 0 1 0 6 GK 35 0 0 1 0 7 GK 25 0 0 1 0 8 GK 32 0 0 1 0 9 GK 40 0 0 0 1 10 GK 50 0 0 0 1 11 MB 60 0 0 0 1 12 MB 70 0 0 0 1
内容的提问来源于stack exchange,提问作者Ahamed Moosa
相关产品推荐
相关产品推荐

