使用iterrows()遍历CSV调用API时出现“index 1 is out of bounds for axis 0 with size 1”错误的原因
问题分析与解决方案
错误原因拆解
你遇到的index 1 is out of bounds for axis 0 with size 1错误,核心是两个逻辑问题导致的:
错误的ID取值方式
在iterrows()循环里,index是DataFrame的行号(从0开始递增),而row是对应行的Series对象,仅包含OBJEKT_ID这一列。当循环到第二行(index=1)时,你用row[index]取值,相当于尝试获取Series的第1个位置元素,但Series只有1列(size=1),直接触发索引越界。正确的姿势是通过列名row['OBJEKT_ID']获取当前行的ID。文件写入的覆盖问题
你的代码每次循环都新建空DataFrame,调用to_csv()时默认用覆盖模式(mode='w'),就算没报错,最终文件也只会保留最后一次循环的结果,根本无法累加所有数据。
修正后的完整代码
下面是调整后的代码,解决了上述问题,同时优化了请求稳定性和数据处理效率:
import pandas as pd import requests import time # 读取原始ID列表 object_df = pd.read_csv("CSV_FILE.csv") # 用列表存储结果,比循环新建DataFrame更高效 results = [] # 遍历每一行,忽略行索引,直接取ID列的值 for _, row in object_df.iterrows(): objekt_id = row['OBJEKT_ID'] try: # 调用API,传入正确的ID response = requests.get( f"url/{objekt_id}", headers=headers) response.raise_for_status() # 主动捕获HTTP请求错误 data = response.json() # 提取CLASS数据(假设API返回结构固定,若有变动需提前校验) class_result = data["features"][0]["properties"]["agande"][0]["agare"]["analyser"] print(f"处理ID: {objekt_id},结果: {class_result}") # 将当前结果存入列表 results.append({ 'OBJEKT_ID': objekt_id, 'CLASS': class_result }) # 控制请求频率:5000次/分钟 ≈ 每0.012秒一次,留一点缓冲避免触发限流 time.sleep(0.013) except Exception as e: # 捕获异常,避免单个请求失败导致整个程序中断 print(f"处理ID {objekt_id}时出错: {str(e)}") # 可以标记错误ID,方便后续排查 results.append({ 'OBJEKT_ID': objekt_id, 'CLASS': 'PROCESS_ERROR' }) # 所有数据处理完成后,统一写入CSV result_df = pd.DataFrame(results) result_df.to_csv("collected_data.csv", index=False) print("所有数据处理并写入完成!")
额外优化建议
- 分批写入避免内存溢出:15万条数据全部存在列表里会占用不少内存,可以每处理1000条就追加写入一次文件,然后清空列表。
- 添加API重试机制:用
tenacity这类库实现自动重试,应对网络波动或API临时限流的情况。 - 校验API返回结构:在提取数据前先检查JSON的键是否存在,避免因API返回格式变化导致的KeyError。
内容的提问来源于stack exchange,提问作者user14657411
相关产品推荐
相关产品推荐

