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

Jupyter Notebook处理奥运数据集遇两问题:输出带Year与KeyError:nan

奥运数据集分析问题解答

嘿,我来帮你拆解这两个pandas使用里的常见小坑~

问题1:为何循环返回结果带"Year"字符串,单独运行相同代码却无此情况?

核心原因是索引方式的差异:

  • 你循环里用的是sports.loc[sport, ['Year']],这里的['Year']是列表形式的索引,返回的是一个带列标签的Series对象,而不是单纯的数值列。当你对这个Series做max()和min()运算后,结果依然是保留"Year"标签的Series,所以打印时会显示Year XXX的格式。
  • 如果你单独运行时用的是sports.loc[sport, 'Year'](注意这里是单个字符串'Year',不是列表),返回的是纯数值组成的Series,运算后得到的就是单个数字,自然不会带"Year"前缀。

举个直观的对比例子:

# 用列表索引,返回带标签的Series
sports.loc['Athletics', ['Year']].max()
# 输出:Year    2016
# dtype: int64

# 用单个列名,返回纯数值
sports.loc['Athletics', 'Year'].max()
# 输出:2016

解决方法很简单:把循环里的['Year']改成'Year'就行啦。

问题2:是什么导致了KeyError: nan错误?

这个错误几乎可以肯定是你的运动项目列表里混入了NaN值:
原始的olympics['Sport']列里存在缺失的运动名称(也就是NaN),当你用olympics['Sport'].unique()提取唯一值时,这个NaN会被包含到sport_name数组里。

当循环到sport=NaN的时候,执行sports.loc[NaN, ...]就会触发KeyError——因为pandas的索引里并不存在"NaN"这个键,而且直接用loc查找NaN索引的行为本身就会报错(和处理普通索引不同)。

你可以先运行print(sport_name)验证一下,肯定能看到NaN的身影。解决方法是生成sport_name时先过滤掉NaN:

sport_name = olympics['Sport'].dropna().unique()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:02:51