pandas 将函数应用于数据框列中的值

y1aodyip  于 2023-09-29  发布在  其他
关注(0)|答案(1)|浏览(101)

我有一个函数,它调用一个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)
1mrurvl1

1mrurvl11#

apply将一个函数和一组不变的参数应用于DataFrame中的每一行,或者在您的情况下,因为您只使用单个列,所以应用于pandas Series中的每个值。
代码中有一个bug,您使用dataframe列 * 调用 * get_coordinates函数,然后尝试在apply函数中使用结果。相反,你想给予函数的名字和任何不变的参数,如API键。Pandas将为每个地址调用该函数。
身份验证的开销很大,因此您确实希望将其从get_coordinates函数中分离出来。只进行一次身份验证,然后在apply中使用经过身份验证的连接。以下是伪代码,因为我对你的API了解不够,但一般流程是

def _get_coordinates(address, connection):
    """Convert an address to coorindates on given connection"""
    return connection.get_address(address)
    
def df_expand_addresses_to_coordinates(df, api_key):
    connection = connect and authenticate with api_key
    try:
        lat_long_series = df['DeliveryAddress'].apply(
                _get_coordinates, connection)
        df[['lat', 'long']] = pd.DataFrame(
                lat_long_series.to_list(), 
                index=lat_long_series.index)
    finally:
        connection.disconnect_and_close()

相关问题