修改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
相关产品推荐
相关产品推荐

