循环拉取URL的JSON数据追加到DataFrame时数据被覆盖如何解决
pandas分页请求接口数据追加合并解决方案
问题根源
你原来的代码存在三个核心问题导致追加失败:
- 循环内部每次都将
df变量赋值为当前页的新数据,直接覆盖了上一轮循环的历史数据 df = df.append(df)的逻辑是将当前页数据重复追加一次,完全没有和历史数据做合并- pandas 1.4及以上版本已经正式弃用
append()方法,官方推荐使用pd.concat()完成数据合并操作
基础修改方案
循环开始前先初始化空的DataFrame存储全量数据,每次请求完成后将当前页数据合并到全量表中:
import pandas as pd # 初始化空DataFrame存储所有数据 all_df = pd.DataFrame() # 若不需要前10条数据可以将offset初始值改回10 offset = 0 while offset < 1000: url = f"https://someurl/?limit=10&offset={offset}" data = pd.read_json(url) # 解析当前页数据 page_df = pd.json_normalize(data['results']) # 合并当前页到全量表,ignore_index会重置行索引避免重复 all_df = pd.concat([all_df, page_df], ignore_index=True) offset += 10 # 输出全量数据 print(all_df)
性能优化方案
如果拉取的数据量较大,推荐先将每页数据存入列表,最后做一次性合并,避免循环中反复生成中间DataFrame带来的性能损耗:
import pandas as pd # 用列表暂存每页数据 page_df_list = [] offset = 0 while offset < 1000: url = f"https://someurl/?limit=10&offset={offset}" data = pd.read_json(url) page_df = pd.json_normalize(data['results']) page_df_list.append(page_df) offset += 10 # 一次性合并所有页数据 all_df = pd.concat(page_df_list, ignore_index=True) print(all_df)
内容的提问来源于stack exchange,提问作者webecho
相关产品推荐
相关产品推荐

