You need to enable JavaScript to run this app. Python基于经纬度提取邮编时geopy报KeyError的解决方法
优惠活动
大模型
产品
解决方案
定价
更多

Python基于经纬度提取邮编时geopy报KeyError的解决方法

错误核心
  • apply传参逻辑完全错误
    原代码给lat_field、lon_field传递的是longlat['LATITUDE_X']、longlat['LONGITUDE_X']两个整列的Series对象,不是函数内df[lat_field]所需的列名字符串(即'LATITUDE_X'、'LONGITUDE_X')。逐行执行函数时,代码会尝试用整列的经纬度数值作为索引匹配数据框列,直接触发报错中Float64Index对应的KeyError。
  • 硬取字典值无容错
    反向地理编码接口返回的地址结构不固定,部分坐标点的返回结果无postcode字段,直接访问location.raw['address']['postcode']会再次触发KeyError,中断全流程。
可直接运行的修复代码
from geopy.geocoders import Nominatim

def get_zipcode(row, geolocator, lat_field, lon_field):
    try:
        lat, lon = row[lat_field], row[lon_field]
        location = geolocator.reverse((lat, lon))
        # 分层用get方法取值,避免结构缺失触发KeyError
        return location.raw.get('address', {}).get('postcode', None)
    except Exception:
        # 捕获接口超时、坐标无效、返回结构异常等问题,返回空值不中断流程
        return None

# 初始化地理编码器
geolocator = Nominatim(user_agent="your_unique_app_name", timeout=10)

# 修正apply传参:传入列名字符串,而非整列Series
longlat['zipcode'] = longlat.apply(
    get_zipcode,
    axis=1,
    geolocator=geolocator,
    lat_field='LATITUDE_X',
    lon_field='LONGITUDE_X'
)
注意事项
  • Nominatim公开接口有严格请求频率限制,逐行批量请求时需增加适当延时,否则会被临时封禁IP。
  • 部分坐标点无匹配邮编属于正常情况,返回空值不影响整体数据处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 02:27:03