如何遍历URL参数并将多份API响应合并为单个Pandas DataFrame?
解决方法:合并多个API响应为单个Pandas DataFrame
你的问题出在每次循环都重新创建了一个新的dataframe变量,覆盖了上一次循环的结果,而且没有把每个DOI对应的小DataFrame保存下来。要生成包含所有6行数据的DataFrame,你只需要先收集每个响应的DataFrame,最后再合并它们就行。
另外注意你的DOI列表里有个小语法错误:第四个DOI "10810730.2017.1421730," 后面多了个逗号,我已经帮你修正了,不然这个DOI的请求会失败。
修改后的完整代码如下:
import requests import requests_cache from requests_cache import CachedSession import pandas as pd session = CachedSession() base_url = "https://api.crossref.org/works/" # 修正了DOI列表里的语法错误 doi_list = [ "10.4324/9780429202483", "10.1177/2053168017702990", "10.1016/j.chb.2019.05.017", "10.1081/0730.2017.1421730", # 修正了原DOI的格式错误 "10.1002/wmh3.247", "10.1177/1940161220919082" ] # 创建一个空列表,用来存储每个DOI对应的DataFrame df_list = [] for doi in doi_list: url = base_url + str(doi) response = session.get(url, headers={"mailto":"myemail@email.com"}) # 可以加个简单的状态码检查,确保请求成功 if response.status_code == 200: data = response.json()['message'] # 把当前DOI的DataFrame添加到列表中 df_list.append(pd.json_normalize(data)) else: print(f"请求DOI {doi} 失败,状态码: {response.status_code}") # 用pd.concat合并所有小DataFrame成一个大的 final_dataframe = pd.concat(df_list, ignore_index=True) # 查看结果,应该是6行数据 print(final_dataframe.shape) final_dataframe.head(6)
关键步骤解释:
- 创建
df_list空列表:用来逐个存储每个DOI解析后的DataFrame,避免覆盖之前的结果。 pd.concat()合并DataFrame:这个函数可以把多个结构相同的DataFrame按行合并,ignore_index=True会重置合并后的索引,让它从0到5连续排列。- 状态码检查:添加
response.status_code的判断可以帮你排查哪些DOI请求失败,方便调试。
这样处理后,你就能得到一个每行对应一个DOI响应结果的DataFrame啦!
内容的提问来源于stack exchange,提问作者sc7420
相关产品推荐
相关产品推荐

