如何将循环生成的多个DataFrame合并为单个DataFrame?
问题描述
我从CSV文件中获取ID列表,通过for循环为每个ID调用API拉取数据,想要把返回结果合并成一个DataFrame,但目前每次循环都会生成独立的DataFrame,无法合并为一个整体。
现有代码
# 从CSV读取iOS应用ID data = pd.read_csv('File.csv') ios = (data['ios_id']) ios_data= [] # 把iOS ID转成列表 for i in ios: ios_data.append(i) for id in ios_data: params = { "os": "ios", "app_id": id, "country": "US", "search_term": "kid", "auth_token": AUTH_TOKEN } response = requests.get(BASE_URL, params) # print(response.status_code) raw = response.json() feedback = raw['feedback'] if feedback != []: feedback_dict = feedback[0] df = pd.DataFrame(feedback_dict) print(df) else: pass
当前输出
content version ... country tags 0 So I love tiles of hop it’s fun but I don’t th... 4.4.0 ... US Family 1 So I love tiles of hop it’s fun but I don’t th... 4.4.0 ... US Love it [2 rows x 9 columns] content ... tags 0 This game is, well, fantastic and I love how B... ... Ads 1 This game is, well, fantastic and I love how B... ... Family 2 This game is, well, fantastic and I love how B... ... Hate it 3 This game is, well, fantastic and I love how B... ... Inappropriate 4 This game is, well, fantastic and I love how B... ... Love it 5 This game is, well, fantastic and I love how B... ... Strenuousness [6 rows x 9 columns]
解决方案
核心问题是每次循环都重新创建了df变量,没有将每次的结果累加存储。按以下方式修改代码即可实现合并:
- 初始化一个空列表,用于存放每个API返回的小DataFrame
- 循环内生成小DataFrame后,将其添加到该列表中
- 循环结束后,使用
pd.concat()将所有小DataFrame合并为一个大DataFrame
修改后的代码:
import pandas as pd import requests # 从CSV读取iOS应用ID,直接转成列表更高效 data = pd.read_csv('File.csv') ios_data = data['ios_id'].tolist() # 初始化列表存储所有反馈数据的DataFrame all_feedback_dfs = [] for app_id in ios_data: params = { "os": "ios", "app_id": app_id, "country": "US", "search_term": "kid", "auth_token": AUTH_TOKEN } response = requests.get(BASE_URL, params) raw = response.json() feedback = raw['feedback'] # 直接判断列表是否非空,写法更简洁 if feedback: feedback_dict = feedback[0] df = pd.DataFrame(feedback_dict) # 将当前ID的反馈DataFrame加入列表 all_feedback_dfs.append(df) # 合并所有小DataFrame,ignore_index重置索引避免重复 final_df = pd.concat(all_feedback_dfs, ignore_index=True) print(final_df)
额外优化说明
- 用
data['ios_id'].tolist()替代原循环append的方式,代码更简洁高效 - 用
if feedback:替代if feedback != []:,符合Python的简洁判断风格 ignore_index=True参数会重置合并后DataFrame的索引,避免出现重复索引问题
内容的提问来源于stack exchange,提问作者Leisyunw
相关产品推荐
相关产品推荐

