批量调用Google Geocode API获取经纬度时重复返回结果的问题排查
问题根源分析
你的问题既不是pandas apply的锅,也不是API本身的问题——核心错误是你只调用了一次Geocode API,而且你的get_long_lat函数根本没用到传入的地址参数,全程在复用最开始那一次的API响应结果,所以不管处理哪个地址,返回的都是第一次请求得到的经纬度。
来拆解一下代码里的具体问题:
- 你在代码开头就执行了
api_response = requests.get(...),这里把整个address1DataFrame(而不是单个地址)传给了API的address参数,API实际是在解析整个DataFrame的字符串形式,碰巧返回了第一个地址的匹配结果; - 你的
get_long_lat函数完全忽略了传入的address参数,直接使用全局的api_response_dict——这意味着不管你传什么地址,它都会返回第一次API调用的固定结果。
修正后的代码
我们需要把API调用逻辑放到get_long_lat函数内部,让每个地址都单独发起请求,同时加上异常处理(避免某个地址解析失败导致整个流程崩溃):
import requests import pandas as pd # 地址列表转DataFrame address_list = ['100 20th St. Seattle WA','300 Main St. Washington DC','100 Main St Richmond VA 23220'] df = pd.DataFrame(address_list, columns=['Address']) # 你的API密钥 api_key = "XXXXXXXXXXXXXXXXXXXXXXXXXX" def get_long_lat(address): # 对每个单独的地址发起API请求 url = f'https://maps.googleapis.com/maps/api/geocode/json?address={address}&key={api_key}' api_response = requests.get(url) api_response_dict = api_response.json() # 处理API响应 if api_response_dict['status'] == 'OK': latitude = api_response_dict['results'][0]['geometry']['location']['lat'] longitude = api_response_dict['results'][0]['geometry']['location']['lng'] return (latitude, longitude) else: # 地址解析失败时返回None或自定义标记 print(f"无法解析地址: {address},状态码: {api_response_dict['status']}") return (None, None) # 使用apply处理每个地址 df['Coordinates'] = df['Address'].apply(get_long_lat) # 拆分出单独的纬度和经度列 df[['Latitude', 'Longitude']] = pd.DataFrame(df['Coordinates'].tolist(), index=df.index) print(df)
额外注意事项
- API配额与费用:Google Geocode API按请求次数收费,批量处理地址前请确认你的配额和预算,避免意外扣费;
- 请求速率限制:不要短时间内发起大量请求,遵守Google的API调用速率限制,必要时可以加入
time.sleep()控制请求间隔; - 地址格式化:尽量保证地址格式规范,能有效提高API解析的准确率。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

