python - 为 API 调用循环 Pandas DataFrame 的最快方法

标签 python pandas python-requests

我的目标是为 Pandas DataFrame 中的每一行调用 API,其中包含响应 JSON 中的字符串列表,并创建一个新的 DataFrame,每个响应一行。我的代码基本上是这样的:

i = 0
new_df = pandas.DataFrame(columns = ['a','b','c','d'])
for index,row in df.iterrows():
    url = 'http://myAPI/'
    d = '{"SomeJSONData:"' + row['data'] + '}'
    j = json.loads(d)
    response = requests.post(url,json = j)

    data = response.json()
    for new_data in data['c']:
        new_df.loc[i] = [row['a'],row['b'],row['c'],new_data]
        i += 1

这工作正常,但我进行了大约 5500 个 API 调用并将大约 6500 行写入新的 DataFrame,因此需要一段时间,可能需要 10 分钟。我想知道是否有人知道加快速度的方法?我不太熟悉在 Python 中运行并行 for 循环,这可以在保持线程安全的同时完成吗?

最佳答案

也许是沿着这些思路?这样你就不会创建一个全新的数据框,你只声明一次 URL,并且你正在利用 pandas 列操作比逐行操作更快的事实。

url = 'http://myAPI/'

def request_function(j):
    return requests.post(url,json = json.loads(j))['c'] 

df['j']= '{"SomeJsonData:"' + df['data'] + '}'
df['new_data'] = df['j'].apply(request_function)

现在要证明在这种情况下使用 apply ( String data ) 确实要快得多,这里有一个简单的测试:

import numpy as np
import pandas as pd
import time

def func(text):
    return text + ' is processed'


def test_one():
    data =pd.DataFrame(columns = ['text'], index = np.arange(0, 100000))
    data['text'] = 'text'

    start = time.time()
    data['text'] = data['text'].apply(func)
    print(time.time() - start)


def test_two():
    data =pd.DataFrame(columns = ['text'], index = np.arange(0, 100000))
    data['text'] = 'text'

    start = time.time()

    for index, row in data.iterrows():
        data.loc[index, 'text'] = row['text'] + ' is processed'

    print(time.time() - start)

Results of string operations on dataframes.

test_one(using apply) : 0.023002147674560547

test_two(using iterrows): 18.912891149520874

基本上,通过使用添加两列的内置 pandas 操作并应用,您应该会得到更快的结果,您的响应时间确实受到 API 响应时间的限制。如果结果仍然太慢,您可能会考虑编写一个将结果保存到列表的异步函数。然后你 send.apply 这个异步函数。

关于python - 为 API 调用循环 Pandas DataFrame 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46799234/

相关文章:

python - 如何在 python 代码中查找列表理解

python - 迭代 pandas 数据框中的两列

python - 从 pandas DataFrame 中选择行 : only rows with at least three ones need to be selected

python 3 从json字典中获取特定值

python - 为什么一个网站的 HTML 和 Python 的请求库给的 HTML 不一样?

python - 尝试获取公会角色时出现 Discord API 401 未经授权错误

python:我可以扩展 range() 方法的上限吗?

python - 如何将 Matplotlib Basemap 的 maskoceans() 应用于多边形面片

python - 在自定义分隔符上拆分字符串列替换相邻的 NaN

python - Pandas 不承认 NaN 为空