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

如何为地点DataFrame获取经纬度?解决geopy调用报错问题

问题排查与修复方案

核心问题分析

  1. 地点解析失败触发None值错误:Nominatim无法识别部分小众区域、缩写(如数据里的RMV),调用geolocator.geocode(address)会返回None,此时直接访问location.latitude就会触发AttributeError。
  2. 重复初始化Geocoder实例:循环内每次创建Nominatim对象,既降低效率,还可能触发API请求频率限制。
  3. 变量名错误:最后给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

关键修改说明

  1. Geocoder实例复用:把Nominatim初始化移到循环外,提升效率并符合API使用规范。
  2. 异常防御处理:添加if location:判断,解析失败时用None占位,避免程序崩溃,同时保留所有原始记录。
  3. 变量名修正:将赋值时的错误变量名替换为实际的lat/long列表。
  4. 失败记录排查:新增代码块帮助定位无法解析的地点,后续可手动补充经纬度或调整地址格式(比如把RMV补全为全称)。

内容的提问来源于stack exchange,提问作者user20273524

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:01:03