You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas DataFrame iloc切片后循环调用loc[0]报错原因问询

报错根本原因
  • Pandas从DataFrame中做切片操作时,默认会保留原始行索引,不会自动重置为从0开始的新索引。你通过iloc[i:i+3]得到的batch_df是原DataFrame的视图,行索引完全继承自原数据集:
    • 第一次循环切片范围是原df的第0~2行,继承的索引就是0,1,2,所以batch_df.loc[0]可以正常命中
    • 第二次循环切片范围是原df的第3~5行,继承的索引是3,4,5,不存在索引值为0的行,因此触发KeyError: 0
  • 该现象和第一次生成的batch_df有没有被覆盖完全无关:每次循环迭代时,batch_df都会被新的切片结果覆盖,旧的对象不会对新批次产生任何影响。
更通用的解决方案

如果你的需求确实是每个批次的索引都从0开始,更推荐在切片后调用reset_index(drop=True)主动重置索引,后续不管是用loc[0]还是按位置取数都不会出问题,兼容性更强:

for i in range(0, len(df), 3):
    print("\n------BATCH BEGIN")
    # drop=True表示直接丢弃原始索引,不会把旧索引转为DataFrame的普通列
    batch_df = df.iloc[i:i+3].reset_index(drop=True)
    print(batch_df)
    print(batch_df.loc[0].at["Name"])
    print("------BATCH END")

你当前改成batch_df.loc[i]的方案可以临时解决问题,但依赖循环变量i和原始索引的对应关系,如果你后续调整切片逻辑、或者原始数据集本身索引不是连续从0开始的,这个写法就会失效,更推荐用重置索引的方案。

内容的提问来源于stack exchange,提问作者mahmood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:45:00