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
相关产品推荐
相关产品推荐

