使用API获取JSON数据时,while循环中pd.concat失效的问题求助
问题解决:CMS API分页数据拼接失败
问题根源
你的代码存在两个核心问题:
want列表从未被添加任何数据,每次循环仅覆盖json_norm变量,最终返回空列表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
相关产品推荐
相关产品推荐

