如何为地点DataFrame获取经纬度?解决geopy调用报错问题
问题排查与修复方案
核心问题分析
- 地点解析失败触发None值错误:Nominatim无法识别部分小众区域、缩写(如数据里的
RMV),调用geolocator.geocode(address)会返回None,此时直接访问location.latitude就会触发AttributeError。 - 重复初始化Geocoder实例:循环内每次创建
Nominatim对象,既降低效率,还可能触发API请求频率限制。 - 变量名错误:最后给DataFrame添加列时,误用了未定义的
latitude/longitude变量,实际应使用你创建的lat/long列表。
修复后的代码
from geopy.geocoders import Nominatim import pandas as pd # 仅初始化一次Geocoder实例,避免重复开销 geolocator = Nominatim(user_agent="MyApp") df = pd.read_csv("../project/LocationIndia.csv") lat = [] long = [] for loc_name in df["Location"]: address = f"{loc_name}, India" # 尝试解析地址 location = geolocator.geocode(address) if location: lat.append(location.latitude) long.append(location.longitude) else: # 解析失败时添加空值,可根据需求替换为默认值 lat.append(None) long.append(None) # 修正变量名,将列表绑定到DataFrame列 df['latitude'] = lat df['longitude'] = long # 可选:排查解析失败的地点,方便后续处理 failed = df[df['latitude'].isna()] print(f"无法解析的地点数量:{len(failed)}") print(failed[['Location']]) df
关键修改说明
- Geocoder实例复用:把
Nominatim初始化移到循环外,提升效率并符合API使用规范。 - 异常防御处理:添加
if location:判断,解析失败时用None占位,避免程序崩溃,同时保留所有原始记录。 - 变量名修正:将赋值时的错误变量名替换为实际的
lat/long列表。 - 失败记录排查:新增代码块帮助定位无法解析的地点,后续可手动补充经纬度或调整地址格式(比如把
RMV补全为全称)。
内容的提问来源于stack exchange,提问作者user20273524
相关产品推荐
相关产品推荐

