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
相关产品推荐
相关产品推荐

