如何对Pandas DataFrame分批分页并批量调用API生成新列?
问题描述
现有如下结构的Pandas DataFrame:
id sentence 1 "Some txt" 2 "Another txt" 3 "Awkward txt" 4 "Last txt" ... 9273
需要将数据按每20条分批处理,调用一次可返回20个元素的批量API,为DataFrame生成新列parsed,最终结构如下:
id sentence parsed 1 "Some txt" 1242 2 "Another txt" 9762 3 "Awkward txt" 9355 4 "Last txt" 4126 ... 9273
实际场景中,希望避免用.apply()循环调用API,而是提取每批的sentence列值批量传入API,再将返回结果对应到原DataFrame的每一行,该如何实现?
解决方案
1. 为数据添加批次分组标记
先给原DataFrame增加一个临时的批次列,通过整数除法将每20条数据划分为同一批次:
import pandas as pd # 假设原数据存储在df中 df['batch'] = df.index // 20 # 如果原索引不是连续整数,先重置索引:df = df.reset_index(drop=True)
2. 按批次批量调用API并赋值
遍历每个批次分组,提取该组的文本列表传入API,再将返回结果精准对应到原DataFrame的行:
# 替换为你的实际批量API调用函数,需保证返回结果与输入列表顺序一致 def batch_api_call(sentence_list): # 示例逻辑:返回模拟的解析结果,实际替换为API调用代码 return [hash(sent) % 10000 for sent in sentence_list] # 遍历每个批次 for batch_num, group in df.groupby('batch'): # 提取当前批次的所有文本 batch_texts = group['sentence'].tolist() # 调用批量API获取结果 parsed_results = batch_api_call(batch_texts) # 将结果赋值回原DataFrame对应行 df.loc[group.index, 'parsed'] = parsed_results # 清理临时批次列 df.drop('batch', axis=1, inplace=True)
3. 关键注意事项
- 索引一致性:如果原DataFrame的索引不连续,必须先执行
df = df.reset_index(drop=True),否则分组会出错。 - 异常处理:API调用需添加重试/异常捕获逻辑,避免单个批次失败导致流程中断,示例如下:
import time from tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10)) def batch_api_call(sentence_list): # 实际API调用逻辑,以POST请求为例 import requests response = requests.post("your_api_url", json={"sentences": sentence_list}) response.raise_for_status() # 触发HTTP状态码异常 return response.json()['parsed_results'] - 顺序一致性:必须确保API返回的结果顺序和输入的文本列表顺序完全匹配,否则会出现结果错位问题。
内容的提问来源于stack exchange,提问作者cadavre
相关产品推荐
相关产品推荐

