数据集预处理时段字段字符串转整数映射触发KeyError:1报错
报错核心根因
本次触发的KeyError: 1并非字典映射逻辑方向错误,本质原因是遍历df.TIMEPERIOD列时,取到的当前单元格值是整数1,而你定义的TIMEPERIOD字典所有键都是字符串类型('Morning'/'Afternoon'/'Evening'/'Night'),字典内不存在键为1的条目,硬做键值查找自然抛出KeyError。
另外原代码存在隐蔽的语法错误:列表推导式里写的TIMEPERIOD[item].copy只是取整数对应的copy方法对象,没有实际执行调用,就算字典匹配成功,最终写入列的值也不是预期的整数编码,而是方法对象本身,后续模型训练环节同样会触发类型报错。
高频触发场景
- 重复执行映射代码:第一次跑通“字符串转整数”逻辑后,列中已经写入1/2/3/4的整数结果,没有重置列值就再次运行同一段代码,遍历到的item全为整数,和字典的字符串键完全不匹配
- 数据原始存在脏值:部分行的TIMEPERIOD字段本身就是预填充的整数编码,没有做前置清洗就直接跑全量映射
可直接复用的修复方案
- 兜底匹配避免硬查报错
先统一列值的类型,通过字典的get方法做兜底匹配,不直接硬访问不存在的键:TIMEPERIOD = {'Morning': 1,'Afternoon': 2,'Evening' : 3,'Night' : 4} # 统一将列转为字符串类型,消除原有整数、空值的类型干扰 df['TIMEPERIOD'] = df['TIMEPERIOD'].astype(str) # 执行匹配,未命中字典的异常值统一填充为0,不会抛出KeyError df['TIMEPERIOD'] = [TIMEPERIOD.get(item, 0) for item in df['TIMEPERIOD']] - 前置定位脏数据
正式跑映射前,先把列中不在字典键范围内的异常值全部筛出,针对性修正数据后再做编码:# 筛选所有无法被字典匹配的异常值 invalid_rows = df[~df['TIMEPERIOD'].astype(str).isin(TIMEPERIOD.keys())] print(f"待修正的异常值共{len(invalid_rows)}行,异常值集合:{invalid_rows['TIMEPERIOD'].unique()}") # 异常值修正完成后,直接用pandas内置的map方法做映射即可,无需手写列表推导 df['TIMEPERIOD'] = df['TIMEPERIOD'].map(TIMEPERIOD) - 去除冗余错误写法
整数是Python的不可变类型,不存在可调用的copy方法,映射时直接取字典对应的值即可,不要额外加.copy后缀。
内容的提问来源于stack exchange,提问作者Muhammad Danial Siddiqui
相关产品推荐
相关产品推荐

