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

Pandas concat函数报FutureWarning:空DataFrame拼接问题求助

警告原因分析
  • 这个FutureWarning源于Pandas即将调整空DataFrame与非空DataFrame拼接的行为。如果你的代码中前几个API返回的数据都不满足检查条件,pd_profiles会一直是空表,等后续遇到有效pd_temp时执行concat,就会触发警告——这类拼接逻辑在未来版本会有变化。
  • 另外,你写的检查条件pd_temp.notnull().all().all()对空表会返回True,如果sub_get_profile返回空表,会被误判为有效数据进入拼接流程,进一步触发警告。
优化方案

核心改法是先把所有有效数据存入列表,最后一次性拼接,既解决警告问题,又提升代码性能:

def update_exchage_data(self):
    key = api_key
    # 从API获取股票列表,示例中硬编码,实际还有其他列
    equities = [["APPL", "MSFT", "NVDA", "GOOG"]] 
    pd_equities = pd.DataFrame(equities, columns=["symbol"])
    profile_columns = ["symbol", "name", "exchange", "sector", "industry"]
    # 用列表存储所有有效结果,替代循环内反复拼接
    valid_profiles = []

    for _, row in pd_equities.iterrows():
        pd_temp = self.sub_get_profile(key, row["symbol"], profile_columns)
        # 修正检查逻辑:先判断非空,再确认所有值均不为空
        if not pd_temp.empty and pd_temp.notna().all(axis=None):
            valid_profiles.append(pd_temp)
    
    # 最后统一拼接,空列表时返回指定列的空表
    pd_profiles = pd.concat(valid_profiles, axis=0, ignore_index=True) if valid_profiles else pd.DataFrame(columns=profile_columns)
    return pd_profiles


def sub_get_profile(self, key, symbol, df_cols):
    # API调用逻辑已省略,返回json_api_response
    # 简化空表处理逻辑,避免多余初始化操作
    try:
        pd_data = pd.DataFrame.from_dict(json_api_response, orient="columns")
        # 强制对齐列,防止API返回列不匹配导致拼接出错
        pd_data = pd_data.reindex(columns=df_cols)
    except (ValueError, TypeError):
        # API返回无效时返回指定列的空表
        pd_data = pd.DataFrame(columns=df_cols)
    return pd_data

优化细节说明

  • 彻底消除警告:仅当列表存在有效数据时才执行concat,完全规避空表与非空表拼接的场景。
  • 性能提升明显:循环收集列表比反复执行pd.concat高效得多,尤其是股票数量较多时,避免了每次拼接都复制整个DataFrame的开销。
  • 逻辑更严谨:修正了空表误判的问题,sub_get_profile中增加异常处理,API返回格式出错时也能正常返回空表;同时用reindex保证返回的DataFrame列与预期一致,防止拼接时出现列不匹配的错误。

内容的提问来源于stack exchange,提问作者JayFou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:53:09