Python运行PubMed爬取数据清洗脚本报KeyError:412如何解决
清洗PubMed爬取数据时触发pandas KeyError: 412 问题解决
该报错与PubMed API变更无关联,属于pandas DataFrame索引使用不当导致的问题。
问题根因
- 你的循环逻辑写死了遍历范围
range(0, 5583),用.at[y, 'AuthorCount']按整数索引逐行取值,但清洗后的dfdrop行索引不是从0开始连续排列的整数序列。 - 你在之前的清洗步骤中执行过删除行操作(去重、删空值、过滤无效条目等),被删除行对应的索引不会自动补齐重排,当循环遍历到y=412时,该索引对应的行已经在之前的清洗步骤中被移除,pandas无法找到匹配的行因此抛出KeyError。
- 从报错回溯栈可以确认,异常完全触发在pandas内部的索引查找逻辑中,根本没有走到API请求/响应解析的链路,因此和API变更无关。如果是API变更导致的问题,报错会出现在爬取请求、返回内容解析阶段,不会延迟到DataFrame取值环节。
修复方案
方案1:最小改动适配原有循环逻辑
在执行统计循环前,先对清洗后的DataFrame重置索引,丢弃原有不连续的旧索引:
# 放在循环统计逻辑的前面执行 dfdrop = dfdrop.reset_index(drop=True)
执行后dfdrop的行索引会重新生成为从0开始的连续整数,和range生成的遍历值完全匹配,不会再出现索引找不到的问题。
方案2:替换手动循环为pandas原生统计逻辑(推荐)
你这段代码的核心逻辑是统计AuthorCount列值等于i的条目占比,完全不需要写手动逐行循环,用pandas自带的向量化运算效率更高,也不会出现索引匹配问题,还不用硬编码总数据条数:
# 直接替换原有的x初始化、for循环计数的整段代码 x = round((dfdrop['AuthorCount'] == i).mean(), 2)
提示:硬编码总长度5583是不好的编码习惯,后续如果调整清洗规则增减数据行数,你还得手动改这个数值,很容易出统计偏差。
内容的提问来源于stack exchange,提问作者Sophie Rønnstad
相关产品推荐
相关产品推荐

