如何将for循环生成的多个DataFrame结果追加合并为单个DataFrame
问题分析与解决方案
你的代码无法合并结果的核心原因有两个:
backtest函数没有返回处理后的DataFrame,函数内部对data的赋值只是局部变量修改,外部完全接收不到处理结果;- 循环中调用函数后直接append原始
data,而非处理后的结果,同时append方法已被pandas弃用,效率低下。
修正后的函数代码
def backtest(ticker, data): fin = si.get_data(ticker) fin.index.rename('date', inplace=True) fin = fin.reset_index(level=0) fin = fin.drop(columns=['high', 'low', 'volume']) fin['intraday_ch_usd'] = fin['close'] - fin['open'] fin['intraday_pct_ch'] = fin['intraday_ch_usd'] / fin['open'] * 100 fin['3d_pr'] = fin['close'].shift(-3) fin['3d_del'] = fin['3d_pr'] - fin['open'] fin['3d_pct_ch'] = fin['3d_del'] / fin['open'] * 100 # 复制原始数据避免修改原数据集 processed_data = data[data['awardee_parent_ticker_symbol'].notna()].copy() processed_data = processed_data.rename(columns={'date_of_news_dispatch': 'date', 'awardee_parent_ticker_symbol': 'ticker'}) processed_data["date"] = pd.to_datetime(processed_data["date"]) processed_data = processed_data.merge(fin, on=['date','ticker']) # 返回处理后的结果 return processed_data
修正后的循环代码
# 用列表收集所有子结果(比append高效且符合pandas最新规范) output_list = [] for ticker in tickers: try: # 获取当前ticker的处理结果 result_df = backtest(ticker, data) # 仅添加非空结果 if not result_df.empty: output_list.append(result_df) except Exception as e: # 打印异常信息便于排查问题 print(f"处理{ticker}时出错: {str(e)}") continue # 合并所有结果 output = pd.concat(output_list, ignore_index=True) output
关键修改说明
- 让
backtest函数返回处理后的DataFrame,确保循环能拿到每个ticker的计算结果; - 函数内复制原始数据,避免修改外部传入的
data; - 使用列表收集所有子结果,最后用
pd.concat合并,替代已弃用的append方法; - 捕获具体异常并打印,方便定位哪个ticker的处理出现问题。
内容的提问来源于stack exchange,提问作者Dimitar D. Georgiev
相关产品推荐
相关产品推荐

