如何让Geopandas仅聚焦美国邮政编码?纽约编码解析异常求助
问题
运行以下代码解析纽约区域邮政编码时,得到了部分非美国的dropoff_location、dropoff_lat和dropoff_lon结果,但所有邮政编码都属于纽约市区域,请问哪里操作有误?
import geopandas from geopy.geocoders import Nominatim geolocator = Nominatim(user_agent="ryan_app") # 应用速率限制器 from geopy.extra.rate_limiter import RateLimiter geocode = RateLimiter(geolocator.geocode) # 应用到DataFrame df['dropoff_location'] = df['dropoff_zip'].apply(geocode) df['dropoff_lat'] = df['dropoff_location'].apply(lambda x: x.latitude if x else None) df['dropoff_lon'] = df['dropoff_location'].apply(lambda x: x.longitude if x else None) df.head()
运行结果:
pickup_datetime dropoff_datetime trip_distance fare_amount pickup_zip dropoff_zip time_of_trip dropoff_location dropoff_lat dropoff_lon 95 2016-02-02 14:00:28 2016-02-02 14:20:22 2.04 13.5 10001 10199 0 days 00:19:54 (Manhattan, New York County, City of New York,... 40.751528 -73.995849 96 2016-02-10 00:25:33 2016-02-10 00:30:09 1.03 5.5 10001 10011 0 days 00:04:36 (Manhattan, New York County, City of New York,... 40.740972 -73.999560 97 2016-02-19 09:19:18 2016-02-19 09:34:41 2.10 11.5 10002 10001 0 days 00:15:23 (Корольовський район, Житомир, Житомирська міс... 50.269960 28.702845 98 2016-02-12 21:14:59 2016-02-12 21:22:33 0.93 6.5 10011 10012 0 days 00:07:34 (Bechloul, Daïra Bechloul, Bouira, 10012, Algé... 36.312195 4.074957 99 2016-02-04 21:25:09 2016-02-04 21:35:38 1.70 9.0 10028 10065 0 days 00:10:29 (San Germano Chisone, Torino, Piemonte, 10065,... 44.894901 7.235602
解决方法
- 问题原因:Nominatim默认会在全球范围内搜索匹配的邮政编码,不少国家/地区存在和美国纽约重复的5位邮编,导致返回了错误的地理信息。
- 修改方案:调用
geocode时添加搜索范围限制,明确指定仅在美国境内查找邮政编码,避免跨区域匹配。
修改后的代码:
import geopandas from geopy.geocoders import Nominatim geolocator = Nominatim(user_agent="ryan_app") # 应用速率限制器,同时添加美国区域搜索限制 from geopy.extra.rate_limiter import RateLimiter # 用字典query明确指定搜索类型为邮政编码,且限制在美国境内 geocode = RateLimiter(lambda zip_code: geolocator.geocode(query={'postalcode': zip_code, 'country': 'us'})) # 应用到DataFrame df['dropoff_location'] = df['dropoff_zip'].apply(geocode) df['dropoff_lat'] = df['dropoff_location'].apply(lambda x: x.latitude if x else None) df['dropoff_lon'] = df['dropoff_location'].apply(lambda x: x.longitude if x else None) df.head()
- 补充说明:使用字典形式的
query参数可以精准限定搜索类型为邮政编码,加上country参数锁定美国范围后,Nominatim只会返回美国境内匹配的邮编结果,彻底解决跨区域匹配错误的问题。
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

