Pandas DataFrame分块执行多表更新查询及IndexError报错解决咨询
报错原因
iterrows()返回的第一个值i是原始DataFrame的全局行索引值,而非当前分块item的内部位置索引。比如你拆分后的第二个分块包含原df第59行的数据,`iterrows()`返回的`i`是5、6、7、8、9,但当前分块本身只有5行,内部位置索引仅为04,用iloc[i](比如iloc[5])访问必然会触发越界错误。
修复后的遍历代码
你不需要通过iloc二次取值,iterrows()返回的第二个值j本身就是当前行的Series对象,直接取对应字段即可:
import numpy as np # 100行拆为20个分块,第二个参数传拆分数量即可 for chunk in np.array_split(df1, 20): print(chunk) for _, row in chunk.iterrows(): # 直接从row中取字段值 print(row['ColumnName']) # 此处可添加你的update查询逻辑
完整实现思路建议
针对你需要对每个分块执行5条不同表update的需求,建议做以下优化:
- 避免逐行执行SQL,优先用批量更新逻辑:把当前分块内需要用到的主键/条件字段提取为列表,用
IN子句一次性更新对应表的匹配数据,大幅减少数据库交互次数 - 增加事务控制:同一个分块的5条update操作绑定为一个事务,要么全部执行成功,要么全部回滚,避免部分更新导致的数据不一致
- 可根据数据库性能调整分块大小,避免单次更新的数据量过大导致数据库锁表
内容的提问来源于stack exchange,提问作者Raghav
相关产品推荐
相关产品推荐

