【问题标题】:Is there a slower or more controlled alternative to .apply()?.apply() 是否有更慢或更可控的替代方案?
【发布时间】:2018-09-19 03:16:24
【问题描述】:

所以这似乎是一个奇怪的问题,但我有一个带有地址的熊猫DataFrame,我想对其进行地理编码,以便获得纬度和经度。

感谢这个非常有用的线程 (new column with coordinates using geopy pandas),我的代码可以使用 .apply(),但我的问题是所有开放的 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


    【解决方案1】:

    要延迟迭代,可以使用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 在 cmets 中建议的那样):

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

    【讨论】:

    • 为什么不将sleep 放在作为apply 参数的函数中?
    • 你能看看我最近的编辑,让我知道我是否在正确的轨道上?
    • @MichaelMelillo 在运行代码之前您仍在对数据进行子设置,而代码应该可以在整个数据帧上工作(缩进也是错误的,但我想这只是一个发布错误) .
    • 谢谢。子集是因为实际上有 2 个限制,一个是每秒,另一个是每天。所以这段代码解决了一个问题,但我必须确定另一种解决方案才能完成完整的数据集。但是使用您的解决方案,我能够对更大的人口进行地理编码。谢谢你的回答。
    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多