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

Python Pandas删除DataFrame非目标年份行报KeyError如何解决

报错原因

你的代码有两个致命问题,直接触发了KeyError:

  • 所有传入drop的赛季值都没加字符串引号,Python会直接把1946-47这类内容识别为算术减法:1946减47等于1899,1979-1980算出来是-1,你实际传给drop的是一堆无意义的整数,根本不是数据表中对应的赛季标签,自然找不到匹配的行。你看报错里列的找不到的值全是1899、-1、1999,全是减法算出来的结果,刚好对应这个问题。
  • 赛季名书写有大量笔误、格式不统一:比如有的赛季后缀写了4位(1979-1980),有的只写2位,还误把数字0写成了Python八进制前缀0o(比如1999-0o0实际运算结果是1999),就算加了引号,这些写错的赛季名也匹配不上CSV里的真实值。
正确实现方案

不要手动枚举所有要删除的赛季,效率极低还容易写错,直接筛选保留你需要的2009-2018年数据即可,根据你的数据结构二选一:

  • 如果赛季是DataFrame里的普通列(比如列名为season),用布尔索引筛选:
# 注意调整字符串格式,和你表中赛季列的实际存储格式保持一致
# 比如表内赛季是"2009-10"这种短格式就用下面这行
team_record = team_record[team_record['season'].between('2009-10', '2017-18')]
# 如果表内赛季是"2009-2010"这种全写格式,就改成对应区间
# team_record = team_record[team_record['season'].between('2009-2010', '2017-2018')]
  • 如果赛季已经被设置为DataFrame的行索引,用loc按标签切片筛选:
# 同样匹配你表内的赛季字符串格式
team_record = team_record.loc['2009-10':'2017-18']

如果你坚持要用drop方法删除无关行,必须把所有要删除的赛季写成带引号的字符串,且格式和表内存储的赛季值完全一致,不能有笔误,示例写法:

# 所有待删除赛季必须加引号,格式完全匹配表内值,不能出现0o这类笔误
drop_list = ['1946-47', '1947-48', '1948-49', ... , '2008-09']
team_record.drop(drop_list, axis=0, inplace=True)

这种枚举删除的写法容错率极低,非常容易漏写、错写赛季值,优先推荐直接筛选保留目标数据的写法。

内容的提问来源于stack exchange,提问作者Nicholas Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 08:46:07