Python遍历DataFrame使用if and条件报KeyError 9如何解决?
报错原因
你的猜测是正确的,KeyError本质是遍历到DataFrame末尾的索引时,row+1、row+2超出了DataFrame的最大索引范围,不存在对应行,所以抛出索引不存在的错误。
可行解决方法
方案1:调整遍历范围(适合小数据量场景)
遍历的时候只遍历到倒数第3行即可,保证row+2不会超出索引范围,同时建议用.loc代替链式索引赋值,避免触发SettingWithCopyWarning:
# 计算最大可遍历的索引,确保row+2不会越界 max_valid_idx = len(df) - 3 for row in df.index: if row > max_valid_idx: break if df.loc[row, 'col1'] == 'b' and df.loc[row+1, 'col1'] == 'name': df.loc[row+1, 'col1'] = 'name1' df.loc[row+2, 'col1'] = 'name2'
如果你的DataFrame索引不是默认的0开始的连续整数,先重置索引再处理:
df = df.reset_index(drop=True) # 再执行上面的遍历逻辑即可
方案2:向量化操作(适合大数据量场景,效率更高)
用pandas自带的shift方法匹配相邻行的条件,不需要写循环,性能比遍历高很多:
# 定位满足条件的行位置 mask = (df['col1'] == 'b') & (df['col1'].shift(-1) == 'name') # 给对应下一行、下两行赋值 df.loc[mask.shift(1, fill_value=False), 'col1'] = 'name1' df.loc[mask.shift(2, fill_value=False), 'col1'] = 'name2'
内容的提问来源于stack exchange,提问作者Irrats
相关产品推荐
相关产品推荐

