You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将for循环生成的多个DataFrame结果追加合并为单个DataFrame

问题分析与解决方案

你的代码无法合并结果的核心原因有两个:

  1. backtest函数没有返回处理后的DataFrame,函数内部对data的赋值只是局部变量修改,外部完全接收不到处理结果;
  2. 循环中调用函数后直接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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:41:01