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

使用API获取JSON数据时,while循环中pd.concat失效的问题求助

问题解决:CMS API分页数据拼接失败

问题根源

你的代码存在两个核心问题:

  1. want列表从未被添加任何数据,每次循环仅覆盖json_norm变量,最终返回空列表
  2. pd.concat用法错误,它需要接收DataFrame列表作为参数,而非单个DataFrame

修正后的代码

import pandas as pd
import requests

url = "https://data.cms.gov/provider-data/api/1/datastore/query/yizn-abxn/0"

def loop_json():
    i = 0
    size = 500
    # 用于存储所有分页的DataFrame
    df_list = []
    
    # 首次请求获取总数据条数,避免硬编码
    initial_resp = requests.get(url, params={"size": 1})
    total_rows = initial_resp.json()['total']
    print(f"总数据条数:{total_rows}")

    while i < total_rows:
        offset_url = f"{url}?size={size}&offset={i}"
        print(f"请求链接:{offset_url}")
        resp = requests.get(offset_url)
        
        # 检查请求是否成功
        if resp.status_code != 200:
            print(f"请求失败,状态码:{resp.status_code}")
            break
        
        json_data = resp.json()
        # 解析当前分页数据并添加到列表
        current_df = pd.json_normalize(json_data['results'])
        df_list.append(current_df)
        
        print(f"已获取第{i}-{i+len(current_df)}条数据")
        i += size
    
    # 合并所有分页DataFrame
    return pd.concat(df_list, ignore_index=True) if df_list else pd.DataFrame()

df = loop_json()
print(f"最终数据行数:{len(df)}")

关键修改说明

  • 动态获取总条数:不再硬编码total_rows=1500,通过首次请求API返回的total字段获取准确总条数,确保覆盖所有数据
  • 分页数据收集:用df_list列表存储每个分页的DataFrame,避免每次循环覆盖单个变量
  • 正确拼接数据:循环结束后将整个DataFrame列表传入pd.concat,并设置ignore_index=True重置索引,避免分页间索引冲突
  • 基础错误处理:增加请求状态码检查,避免因请求失败导致程序异常

内容的提问来源于stack exchange,提问作者tonybot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:59:52