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
- 第一次循环切片范围是原df的第0~2行,继承的索引就是
- 该现象和第一次生成的
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
相关产品推荐
相关产品推荐

