【发布时间】:2017-10-17 21:07:22
【问题描述】:
我的目标是为 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 循环不太熟悉,这可以在保持线程安全的同时完成吗?
【问题讨论】:
-
由于您的数据框有多个
dtype=object列,因此仅使用iterrows将尽可能快。您可以尝试线程,因为请求是 i/o 绑定的。在这种情况下,请查看示例 here。请注意,这个问题最初是在 7 年前提出的。所以看看最近的例子。 -
我会在 pandas 之外使用
requests-futures来发出异步请求,获取结果,然后重建列。 -
问题不在于循环。这是api调用。我不知道 web api 是否可以处理批量查询。我不是 @roganjosh 建议的专家……但这听起来是个好主意。
-
另外,你应该考虑不要使用
requests,因为它是同步设计的。查看一些选项here
标签: python pandas python-requests