我的目标是为 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/