如何通过循环从函数结果创建多个DataFrame或合并为单表
问题与解决方案
场景说明
我有一个调用API获取数据的函数getAPICore(Year),输入参数为年份。现在有一个包含唯一年份的DataFrame base_years,需要循环调用该函数,实现两个目标:
- 生成多个以年份命名的DataFrame;
- 将所有结果追加到单个DataFrame中,新增年份维度。
问题1:生成多个以年份命名的DataFrame
原代码错误原因
你写的output_df_ + b_years = pd.DataFrame(getAPICore(b_years))属于语法错误,Python不允许通过字符串拼接的方式直接创建变量名。
正确实现方式
推荐用字典来存储这些DataFrame,既安全又方便后续调用:
# 初始化空字典存储各年份的DataFrame year_dfs = {} # 遍历base_years的年份列(假设年份存放在第一列,可根据实际调整索引) for b_year in base_years.iloc[:, 0]: if b_year != '' and b_year >= 2017: # 以年份为键,存储对应的DataFrame year_dfs[f"output_df_{b_year}"] = pd.DataFrame(getAPICore(b_year))
后续要调用某一年的DataFrame,直接用year_dfs["output_df_2017"]即可。
如果一定要生成全局变量(不推荐,容易污染命名空间),可以用globals():
for b_year in base_years.iloc[:, 0]: if b_year != '' and b_year >= 2017: globals()[f"output_df_{b_year}"] = pd.DataFrame(getAPICore(b_year))
问题2:追加到单个DataFrame并添加年份维度
原代码错误原因
pd.DataFrame.append()是DataFrame的实例方法,不能直接用类调用;而且每次赋值outputdf_name = ...会覆盖之前的结果,导致最终只有最后一次的数据。
正确实现方式
方法1:循环追加(适合数据量不大的场景)
# 初始化空DataFrame output_df = pd.DataFrame() for b_year in base_years.iloc[:, 0]: if b_year != '' and b_year >= 2017: # 调用API获取数据并转为DataFrame temp_df = pd.DataFrame(getAPICore(b_year)) # 添加年份列作为新维度 temp_df['year'] = b_year # 追加到主DataFrame(pd.concat比append高效,append已被官方弃用) output_df = pd.concat([output_df, temp_df], ignore_index=True)
方法2:先收集再合并(更高效,适合数据量大的场景)
df_list = [] for b_year in base_years.iloc[:, 0]: if b_year != '' and b_year >= 2017: temp_df = pd.DataFrame(getAPICore(b_year)) temp_df['year'] = b_year df_list.append(temp_df) # 一次性合并所有DataFrame output_df = pd.concat(df_list, ignore_index=True)
内容的提问来源于stack exchange,提问作者DGMS89
相关产品推荐
相关产品推荐

