如何将多列表数据传入API计算驾车距离并生成DataFrame
解决方案
1. 导入所需库
先把处理数据、发请求、实现延迟需要的库导入:
import pandas as pd import requests import json import time
2. 优化API请求函数(增加错误处理)
你的原函数没考虑请求失败或无路线的情况,很容易报错,先做优化:
def get_driving_distance(lat1, lon1, lat2, lon2): try: r = requests.get(f"http://router.project-osrm.org/route/v1/car/{lon1},{lat1};{lon2},{lat2}?overview=false") # 检查请求是否成功,失败直接抛出异常 r.raise_for_status() routes = json.loads(r.content) # 检查是否有有效路线数据 if not routes.get("routes"): return None route_1 = routes["routes"][0] driving_distance = route_1['distance'] return driving_distance / 1609.34 # 转换为英里 except Exception as e: print(f"计算距离出错: {e}") return None
3. 构建DataFrame并批量计算距离
假设你的四个列表分别叫location_lats、location_lons、station_lats、station_lons,按以下步骤操作:
# 替换成你实际的四个数据列表 location_lats = [40.7128, 34.0522] location_lons = [-74.0060, -118.2437] station_lats = [40.7580, 34.0116] station_lons = [-73.9855, -118.4942] # 生成初始DataFrame df = pd.DataFrame({ "地点纬度": location_lats, "地点经度": location_lons, "车站纬度": station_lats, "车站经度": station_lons }) # 新增距离列并初始化 df["驾车距离(英里)"] = None # 循环计算距离,同时控制请求频率 request_count = 0 for idx, row in df.iterrows(): distance = get_driving_distance( row["地点纬度"], row["地点经度"], row["车站纬度"], row["车站经度"] ) df.at[idx, "驾车距离(英里)"] = distance # 每500次请求暂停5秒 request_count += 1 if request_count % 500 == 0: print(f"已完成{request_count}次请求,暂停5秒...") time.sleep(5) # 查看最终结果 print(df)
关键提示
- 错误处理:新增的
try-except块能捕获请求超时、API返回异常等情况,避免程序直接崩溃,出错时会打印提示并返回None。 - 频率控制:通过
request_count计数,每累计500次请求就暂停5秒,避免触发API的限流机制。 - DataFrame操作:用
iterrows()遍历每一行,df.at[idx, 列名]精准更新对应行的距离值,逻辑直观,适合新手理解。
内容的提问来源于stack exchange,提问作者Alastairstirling
相关产品推荐
相关产品推荐

