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

如何在pandas列中使用Geopy批量获取城市经纬度?

报错原因

geolocator.geocode()方法在无法匹配到对应城市地址时,会返回None值,你的代码没有对返回结果做非空判断,直接访问None的latitude属性,就触发了AttributeError。
常见的返回None的场景包括:

  • 城市名拼写错误、存在特殊字符或别名
  • 城市名模糊,Nominatim服务无法定位到唯一对应地点
  • 短时间请求次数过多触发限流,或请求超时,服务无有效返回

修复代码

首先优化自定义函数,增加非空判断和异常处理,同时将geolocator实例化移出函数,避免重复创建实例降低效率:

from geopy.geocoders import Nominatim
from geopy.exc import GeocoderTimedOut
import pandas as pd
import time

# 全局实例化一次即可,user_agent建议修改为你的专属标识(比如项目名称)
geolocator = Nominatim(user_agent="your_custom_agent_name")

def lat_long(address):
    try:
        # 可在地址后拼接国家/州信息提升匹配准确率,比如 address + ", Brasil"
        location = geolocator.geocode(address, timeout=10)
        # 加1秒延迟避免触发限流,数据量小可以去掉
        time.sleep(1)
        if location:
            return pd.Series([location.latitude, location.longitude])
        return pd.Series([None, None])
    except GeocoderTimedOut:
        return pd.Series([None, None])

调用函数将经纬度直接存入DataFrame的两列中:

df[['latitude', 'longitude']] = df['Cidade'].apply(lat_long)

运行后你可以筛选latitude为空的行,单独检查对应城市名是否有拼写错误,手动补充经纬度即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:30:06