我有一个函数,它调用一个MapAPI,并返回给定非结构化地址数据的经度和纬度。这个管用,我就能通过
address = "12 & 14 CHIN BEE AVENUE,, SINGAPORE 619937"
lat, lon = get_coordinates(api_key, address)
print(lat, lon)
得到一个像1.3332439 103.7118193
这样的结果
在此之前,我有一个SQL查询,它用我想要的地理编码的所有地址填充 Dataframe 。将函数应用于dataframe中的每个值,并将longs和lats存储在dataframe中的单独列中的最佳方法是什么?
我尝试创建一个全新的 Dataframe 并使用apply,但这会运行异常长的时间df2 = df.apply(get_coordinates(api_key, df['DeliveryAddress']))
。
我也尝试过基于这个答案的df['coords'] = df['DeliveryAddress'].apply(get_coordinates(api_key, df['DeliveryAddress']))
,但我认为我传递参数给函数的方式是错误的。请帮助我指出正确的方向。
编辑:
这是我目前使用的代码,当传递一个地址时:
def get_coordinates(api_key, address):
base_url = "http://someURL.net/REST/v1/Locations"
params = {
"query": address,
"key": api_key
}
response = requests.get(base_url, params=params)
response.raise_for_status()
data = response.json()
coordinates = data["resourceSets"][0]["resources"][0]["point"]["coordinates"]
return coordinates
address = "12 & 14 CHIN BEE AVENUE,, SINGAPORE 619937"
lat, lon = get_coordinates(api_key, address)
print(lat, lon)
1条答案
按热度按时间1mrurvl11#
apply
将一个函数和一组不变的参数应用于DataFrame中的每一行,或者在您的情况下,因为您只使用单个列,所以应用于pandas Series中的每个值。代码中有一个bug,您使用dataframe列 * 调用 *
get_coordinates
函数,然后尝试在apply
函数中使用结果。相反,你想给予函数的名字和任何不变的参数,如API键。Pandas将为每个地址调用该函数。身份验证的开销很大,因此您确实希望将其从get_coordinates函数中分离出来。只进行一次身份验证,然后在
apply
中使用经过身份验证的连接。以下是伪代码,因为我对你的API了解不够,但一般流程是