是否有更慢或更受控制的替代.apply()?

时间:2018-04-09 16:42:23

标签: python pandas geocoding

所以这可能看起来像一个奇怪的问题,但我有一个带有地址的熊猫DataFrame,我想要进行地理编码以便获得经度和纬度。

由于这个非常有用的线程(new column with coordinates using geopy pandas),我的代码可以使用.apply(),但我的问题是所有开放API都限制了它们允许的每秒请求数,并且还要求每天。

我还没有找到任何方法来限制我的代码,以便与API的限制相匹配。我的DF有25K行,但是如果我用最多5行创建它的子集,我只能成功地进行地理编码。

我没有很多python和pandas的经验,但在SAS中,DATA步骤一次迭代一行,所以我可以使用一个睡眠命令来限制请求。使用python / pandas实现类似功能的最佳方法是什么?

编辑:所以基于到目前为止的答案,我想确认,我的代码将改为: df_small['city_coord'] = df_small['Address'].apply(geolocator.geocode).apply(lambda x: (x.latitude, x.longitude))
致:

df_small = df_clean[:5]
def f(x, delay=1):
# run your code    
sleep(delay)
return geolocator.geocode(x)

df_small['city_coord'] = df_small['Address'].apply(f).apply(lambda x: (x.latitude, x.longitude))

1 个答案:

答案 0 :(得分:3)

要延迟迭代,您可以使用df.iterrows()time.sleep()

from time import sleep

for row in df.iterrows():
    # run your code
    sleep(1) # how many seconds to wait

或者您可以将time.sleep()放在apply函数本身内(正如@RafaelC在评论中所建议的那样):

def f(x, delay=1):
    # run your code
    sleep(delay)

df.apply(f)