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

问题描述 投票:0回答:2

所以这可能看起来是一个奇怪的问题,但我有一个 pandas

DataFrame
,里面有地址,我想对其进行地理编码,这样我就可以获得纬度和经度。

我有使用

.apply()
工作的代码,这要归功于这个非常有用的线程(使用 geopy pandas 的坐标新列),但我的问题是所有开放 API 对每秒允许的请求数都有严格的限制,还有每天的请求。

我还没有找到任何方法来限制我的代码,因此符合 API 的限制。我的 DF 有 25K 行,但只有在创建最多 5 行的子集时,我才能成功进行地理编码。

我对 python 和 pandas 没有太多经验,但在 SAS 中,DATA 步骤一次迭代一行,因此我可以使用 sleep 命令来限制请求。使用 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))
python pandas geocoding
2个回答
5
投票

要延迟迭代,可以使用

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)

0
投票

我遇到了类似的问题,但批准的解决方案对我不起作用,因为我想拨打一批电话并等待不同的时间,而不仅仅是在通话之间等待一秒钟。假设您每分钟发送的电子邮件不超过 5 封。您可以采用上述批准的应答方法,方法是除以每分钟的呼叫次数,然后在每次呼叫之间休眠那么多秒。在这种情况下,您的函数每次都会休眠 12 秒 (60/5 = 12)。

为了我的目的(也可能是其他人的目的),我想发送所有 5 个请求,然后稍等一下。在这种情况下,您可以在可执行代码后附加一个 if 语句,该语句检查您的索引模您的间隔是否为零。您可能需要设置为从 1 开始才能工作(如果尚未设置):

df.index = range(1, len(df) + 1)

 df(row, interval, time_delay):
     # execute your code
     if row.name % interval == 0:
     sleep(time_delay)
© www.soinside.com 2019 - 2024. All rights reserved.