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
相关产品推荐
相关产品推荐

