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

修改DataFrame起始索引为1后遍历报错,如何解决?

DataFrame重索引后遍历报错的解决办法

问题场景

要把DataFrame的索引从0起始改成1起始,用了这段代码:

data = {'col_1': [3, 2, 1, 0], 'col_2': ['a', 'b', 'c', 'd']}
df = pd.DataFrame.from_dict(data)
df.index += 1

但用iterrows()遍历,再通过df.loc[index]访问行时,最后一个索引会抛出错误:"single positional indexer is out-of-bounds",遍历代码如下:

for index, line in df.iterrows():
    print(df.loc[index])

解决思路与方案

1. 直接用iterrows()返回的行对象(最优解)

iterrows()每次迭代都会返回当前行的索引和对应的行数据(Series类型),你完全不需要再通过df.loc[index]重复获取行数据,直接用返回的line就行:

for index, line in df.iterrows():
    print(line)

这种方式既省去了多余的索引查找操作,也从根源上避免了索引相关的错误。

2. 确保索引设置的准确性

如果一定要保留df.loc[index]的写法,先确认索引是连续且正确的。可以换一种更明确的方式修改索引:

data = {'col_1': [3, 2, 1, 0], 'col_2': ['a', 'b', 'c', 'd']}
df = pd.DataFrame.from_dict(data)
# 直接生成从1开始的连续索引
df.index = range(1, len(df) + 1)

修改后索引是[1,2,3,4],此时再运行原遍历代码就能正常执行,df.loc[index]可以精准定位到对应行。

3. 换用更高效的itertuples()遍历

如果追求遍历效率,推荐用itertuples()替代iterrows()——它的运行速度更快,返回的是命名元组,访问数据更直接:

for row in df.itertuples():
    # 直接访问列值
    print(row.col_1, row.col_2)
    # 也可以通过元组里的Index属性定位行
    print(df.loc[row.Index])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:20:15