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

如何将多列表数据传入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:52:08