Python中Pandas DataFrame单索引取值正常范围索引返回空值原因咨询
问题原因
- 核心诱因是你提取到的
file152['Dept Code']Series对象的索引并非和位置一一对应的默认连续整数RangeIndex,大概率是字符串类型的数字索引,或是乱序的自定义整数索引,叠加pandas[]操作符「标签优先、匹配失败 fallback 到位置」的兼容逻辑,导致单值取值和切片取值行为不一致:- 单个整数取值时:pandas发现索引中不存在对应数值类型的标签,会自动切换为按位置取值,因此你输入8030、8037时实际取的是对应位置的元素,能正常返回结果。
- 切片取值时:pandas会严格按标签匹配,不会触发位置 fallback,你传入的整数切片范围和实际的字符串/乱序索引匹配不到任何值,最终返回空Series。
- 至于
iloc也返回空的问题,优先排查操作失误:iloc是严格按位置取值的接口,切片规则为左闭右开,如果你的Series长度大于8037仍返回空,可确认是否拼写错误,或是当前使用的pandas版本存在兼容性问题。
解决方法
- 方法1:重置索引为默认连续整数RangeIndex,让索引和位置完全对应,后续取值逻辑统一无歧义:
执行代码file152 = file152.reset_index(drop=True),重置后直接调用file152['Dept Code'][8030:8037]即可拿到对应位置的7条数据。 - 方法2:统一使用显式位置取值接口
iloc,规避隐式逻辑的歧义:
要取位置8030到8036的元素(iloc切片左闭右开,要覆盖到位置8036则结束值填8037),直接写file152['Dept Code'].iloc[8030:8037]即可。如果仍返回空,先执行print(len(file152))确认DataFrame总行数是否大于8030。 - 方法3:如果需要保留原有索引按标签切片,先把索引转为整数类型,再用
loc按标签取值:
执行代码file152.index = file152.index.astype(int),之后调用file152['Dept Code'].loc[8030:8037]就能匹配到所有标签在8030到8037之间的记录(loc切片为左闭右闭,会包含标签为8037的记录)。
内容的提问来源于stack exchange,提问作者Sinner Lee
相关产品推荐
相关产品推荐

