pandas遍历DataFrame按条件取值报KeyError:0如何解决
报错原因
触发KeyError: 0的核心问题是索引引用方式错误:你写的data['test'][i]属于链式索引,方括号中传入的i会被识别为索引标签而非行位置,一旦DataFrame的索引不是从0开始的连续整数(比如做过筛选、排序、分组重置等操作后),就会找不到对应标签触发KeyError。
另外你贴出的DataFrame创建代码末尾缺失一个闭合右括号,也会触发语法错误。
解决方法
方法1:修正原有循环逻辑(仅做问题修复,不推荐生产环境使用)
使用.iloc按行位置取值,同时补全代码缺失的语法符号,逻辑和你原有写法完全一致:
import pandas as pd # 补全缺失的右括号 data = pd.DataFrame({"test":[12, 4, 5, 4, 1, 3, 2, 5, 10, 9]}) oxygen = [] for i in range(len(data)): val = data['test'].iloc[i] oxygen.append(4 if val >=4 else val)
运行后即可得到预期输出[4,4,4,4,1,3,2,4,4,4]。
方法2:pandas向量化实现(推荐,代码简洁性能高)
这类批量阈值判断逻辑不需要手写for循环,直接用pandas内置方法即可实现,性能比手写循环高数十倍,还能规避绝大多数索引相关报错:
- 用
clip方法直接设置数值上限为4,最后转列表即可:
oxygen = data['test'].clip(upper=4).tolist()
- 也可以用条件判断方法
where实现,效果完全一致:
oxygen = data['test'].where(data['test'] < 4, 4).tolist()
提示:处理pandas批量数据时优先使用内置向量化接口,尽量避免手写逐行循环,能减少90%以上的索引、取值类报错。
内容的提问来源于stack exchange,提问作者Murray Ross
相关产品推荐
相关产品推荐

