You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数据集预处理时段字段字符串转整数映射触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 15:06:05