Pandas Series索引赋值一处报KeyError一处正常的原因
问题复现
将代码拆分为3个独立块在Jupyter中运行,效果如下:
- 第一个代码块:初始化测试用的Series对象
import pandas as pd data = pd.Series([1,2,3,4,5], index=['a', 'b', 'c', 7, 8]) data
运行输出:
a 1 b 2 c 3 7 4 8 5 dtype: int64
- 第二个代码块:用字符串键赋值
data['g']=5 # 无报错 data
运行输出:
a 1 b 2 c 3 7 4 8 5 g 5 dtype: int64
可以看到Series末尾正常新增了索引为g的元素。
- 第三个代码块:用整数键赋值
data[9] = 7 # 触发报错
运行后抛出错误:IndexError: index 9 is out of bounds for axis 0 with size 6
报错原因
核心是Pandas方括号[]操作符,在处理混合类型索引(索引同时包含字符串、整数两类标签)的Series时,对不同类型入参的判定逻辑不一致:
- 传入字符串类型的键时,Pandas默认走标签索引逻辑:如果键不在现有索引中,直接作为新标签追加到Series末尾,不做额外校验,因此
data['g']=5可以正常执行。 - 传入整数类型的键时,Pandas会优先走位置索引逻辑(和
iloc的规则一致,从0开始按元素排列顺序计数):此时不会先校验整数是否存在于标签列表,而是先判断整数是否超出当前Series的位置范围。执行完第二行赋值后,Series总长度为6,合法位置索引范围是0~5,传入的9超出范围,直接触发位置越界错误,不会进入新增标签的逻辑分支。
如果确实要新增标签为整数9的元素,需要显式用loc声明走标签索引逻辑,代码如下:
data.loc[9] = 7
运行后就可以正常在Series末尾追加对应元素。
内容的提问来源于stack exchange,提问作者stories shubham
相关产品推荐
相关产品推荐

