有没有办法使用 pgeocode 加快在大型数据帧上查询邮政编码的经纬度?
Posted
技术标签:
【中文标题】有没有办法使用 pgeocode 加快在大型数据帧上查询邮政编码的经纬度?【英文标题】:Is there a way to speed up querying latitude-longitude of postcodes on a large dataframe using pgeocode? 【发布时间】:2021-10-20 05:38:06 【问题描述】:我有一个大约 10 万行的数据框,其中包含邮政编码和国家/地区代码。我想获取每个位置的纬度和经度并将其保存在两个新列中。我有一个关于数据帧样本的工作代码(例如 100 行),但在所有数据帧上运行它需要很长时间(> 1 小时)。我是 Python 新手,我怀疑应该有一种更快的方法来做到这一点:
-
对于给定的
postcode
和country_code
,我查询了两次,一次是纬度,一次是经度。我非常确信我不应该这样做(即我可以每行进行一个查询并相应地创建纬度和经度列)。
我定义函数get_lat(pcode, country)
和get_long(pcode, country)
并应用于数据帧的方式效率不高。
下面是我的代码示例。
import pgeocode
import numpy as np
import pandas as pd
#Sample data
df = pd.DataFrame('postcode':['3011','3083','3071','2660','9308','9999'], 'country_code': ['NL','NL','NL','BE','BE','DE'])
#There are blank postcodes and postcodes that pgeocode cannot return any value, so I am using try-except (e.g. last row in sample dataframe):
#function to get latitude
def get_lat(pcode, country):
try:
nomi = pgeocode.Nominatim(country)
x = nomi.query_postal_code(pcode).latitude
return x
except:
return np.NaN
#function to get longitude
def get_long(pcode, country):
try:
nomi = pgeocode.Nominatim(country)
x = nomi.query_postal_code(pcode).longitude
return x
except:
return np.NaN
#Find and create new columns for latitude-longitude based on postcode (ex: 5625) and country of postcode (ex: NL)
df['latitude'] = np.vectorize(get_lat)(df['postcode'],df['country_code'])
df['longitude'] = np.vectorize(get_long)(df['postcode'],df['country_code'])
【问题讨论】:
【参考方案1】:作为替代解决方案,我从以下网站下载了 txt 文件:http://download.geonames.org/export/zip/
下载文件后,只需导入txt文件并加入即可。它更快但静态,即您在更早的时间使用邮政编码数据库的快照。
另一个优点是您可以检查文件并检查邮政编码的格式。使用 pgeocode
时,更难跟踪接受的邮政编码格式并理解查询返回 null 的原因。
【讨论】:
以上是关于有没有办法使用 pgeocode 加快在大型数据帧上查询邮政编码的经纬度?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法为 UIScrollView 中的不同图层设置不同的帧大小?