如何用Pandas+Geopy批量从坐标提取墨西哥州名
用Pandas Apply批量提取墨西哥州名(附速度优化)
1. 基础实现:单个坐标处理函数
先封装单个坐标的反向地理编码逻辑,包含异常处理和墨西哥州字段的解析:
import pandas as pd from geopy.geocoders import Nominatim from geopy.extra.rate_limiter import RateLimiter # 初始化地理编码器,必须设置user_agent标识你的应用 geolocator = Nominatim(user_agent="mexico_state_lookup") # 添加请求频率限制,避免触发服务封禁 reverse_geocode = RateLimiter(geolocator.reverse, min_delay_seconds=1) def extract_mexico_state(lat, lon): try: # 执行反向地理编码 location = reverse_geocode((lat, lon), exactly_one=True) if not location: return None # 从返回的地址组件中提取州名(Nominatim中墨西哥州对应键为'state') address_components = location.raw.get('address', {}) return address_components.get('state') except Exception as e: print(f"Failed to process ({lat}, {lon}): {str(e)}") return None
2. 用Apply批量处理DataFrame
直接使用df.apply()遍历每一行,传入经纬度调用上述函数:
# 读取Excel数据 df = pd.read_excel("your_data.xlsx") # 假设你的经纬度列名为'latitude'和'longitude',生成新列存储州名 df['mexico_state'] = df.apply( lambda row: extract_mexico_state(row['latitude'], row['longitude']), axis=1 ) # 可选:保存结果到新Excel df.to_excel("data_with_states.xlsx", index=False)
3. 速度优化方案
针对反向地理编码速度慢的问题,推荐两个关键优化:
3.1 缓存重复坐标结果
用functools.lru_cache缓存已查询过的坐标,避免重复请求:
from functools import lru_cache # 注意:将经纬度转为可哈希的元组,才能被缓存 @lru_cache(maxsize=None) def extract_mexico_state_cached(lat, lon): return extract_mexico_state(lat, lon) # 调用缓存后的函数 df['mexico_state'] = df.apply( lambda row: extract_mexico_state_cached(row['latitude'], row['longitude']), axis=1 )
3.2 并行处理(大数据量场景)
用swifter库实现并行化apply,利用多线程提升处理速度:
import swifter # 缓存+并行处理 df['mexico_state'] = df.swifter.apply( lambda row: extract_mexico_state_cached(row['latitude'], row['longitude']), axis=1 )
注意事项
- 先清理数据:提前删除经纬度列的缺失值(
df = df.dropna(subset=['latitude', 'longitude'])),避免无效请求。 - 遵守Nominatim服务规则:不要随意降低
min_delay_seconds,否则可能被临时封禁IP。 - 超大数据量:如果数据量过万,建议改用付费地理编码服务,速度和稳定性更优。
内容的提问来源于stack exchange,提问作者Rafael del Rincón
相关产品推荐
相关产品推荐

