You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 18:22:51