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

如何通过apply()方法将Geopy应用于pandas列并提升地理编码效率

大规模城市地理编码效率优化方案

你当前的方案耗时过长核心原因有两点:一是公共Nominatim服务强制要求最低1秒的请求间隔,91万条请求天然需要超过250小时的运行时间;二是未对重复的城市名称做去重处理,大量重复请求浪费了时间。可通过以下方法优化:

  • 优先做城市去重映射
    城市列必然存在大量重复值,先提取唯一值编码再映射回原表,可减少90%以上的请求量,代码示例:

    # 提取去重后的城市列表
    unique_cities = df['Cidade'].drop_duplicates().reset_index(drop=True).to_frame('Cidade')
    # 仅对唯一城市执行地理编码
    unique_cities['location'] = unique_cities['Cidade'].progress_apply(geocode)
    # 编码结果关联回原DataFrame
    df = df.merge(unique_cities, on='Cidade', how='left')
    
  • 使用离线城市经纬度库匹配
    如果你只需要城市级别的经纬度,不需要精确地址,不需要发起网络请求,直接用现成的全球城市经纬度数据集本地关联即可,百万条数据几秒即可处理完成。你可以直接下载包含所有城市名称、经纬度的离线数据集,将你的Cidade列和数据集的城市名称字段做关联,直接获取经纬度。

  • 搭建本地Nominatim服务
    公共Nominatim的速率限制是平台规则导致的,你可以自行搭建本地的Nominatim服务,完全没有请求速率限制,也不用担心被封禁,编码效率可以提升几十到上百倍。

  • 更换批量地理编码服务
    可以选用支持批量请求的商用地理编码服务,一次可以提交上百条地址查询,相比单条请求效率提升明显,部分服务针对城市级查询还有免费额度。

  • 优化请求参数
    如果你继续使用公共Nominatim服务,可以给geocode方法增加参数缩小查询范围,减少单条请求耗时:

    # 示例:限定查询为城市级别,仅返回一个结果,若你数据是特定国家可增加country参数
    df['location'] = df['Cidade'].progress_apply(lambda x: geocode(x, exactly_one=True, featuretype='city'))
    

内容的提问来源于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 12:15:03