Pandas使用pd.concat拼接DataFrame时处理不存在变量报错问题
动态生成的Pandas DataFrame拼接实现方案
报错来自两个核心问题:
- 硬编码全量变量名传参时,未生成的变量会触发
NameError - 筛选得到变量名字符串列表后,没有转换为实际的DataFrame对象,且传参时多嵌套了一层列表,触发
TypeError
以下是两种可直接落地的实现方式,优先推荐第一种:
方案1:源头改造(最佳实践,无风险)
不要在if分支中动态生成独立命名的result_x变量,提前初始化统一的存储容器,每个分支生成DataFrame后直接存入容器,最终直接拼接容器内的对象即可,完全不需要做变量存在性判断。
import pandas as pd # 初始化存储列表 df_container = [] # 原有if分支逻辑示例,不需要单独给每个结果赋值result_x if 满足分支1条件: tmp = pd.DataFrame(...) # 原result_1的生成逻辑 df_container.append(tmp) if 满足分支2条件: tmp = pd.DataFrame(...) # 原result_2的生成逻辑 df_container.append(tmp) # 其余12个分支逻辑保持一致,生成结果直接append即可 # 一行完成拼接 final_df = pd.concat(df_container, ignore_index=True)
如果需要保留result_x的编号映射关系,可以用字典作为存储容器:
df_container = {} if 满足分支1条件: df_container['result_1'] = pd.DataFrame(...) # 其余分支逻辑同上 # 拼接时取字典的值即可 final_df = pd.concat(df_container.values(), ignore_index=True)
该方案可维护性最高,不会出现误匹配无关变量的问题(比如你之前模糊匹配时意外捞到的result_15就属于无关脏数据),后续增减分支不需要调整拼接逻辑。
方案2:最小改动兼容现有代码
如果不想修改原有if分支的赋值逻辑,可以通过作用域字典动态获取已生成的DataFrame对象,注意提前配置变量名白名单,不要靠关键字模糊匹配。
import pandas as pd # 配置预期内的所有变量名白名单,避免捞到无关数据 expect_vars = ['result_14', 'result_13', 'result_12', 'result_11', 'result_10', 'result_9', 'result_8', 'result_7', 'result_6', 'result_5', 'result_4', 'result_3', 'result_2', 'result_1'] valid_dfs = [] local_vars = locals() for var_name in expect_vars: # 先判断变量是否已定义,再校验类型为DataFrame if var_name in local_vars and isinstance(local_vars[var_name], pd.DataFrame): valid_dfs.append(local_vars[var_name]) # 直接传入有效DataFrame列表拼接,不要额外嵌套列表 final_df = pd.concat(valid_dfs, ignore_index=True)
注意:不建议直接用
dir()遍历+关键字匹配的方式筛选变量,很容易把同命名规则的无关DataFrame纳入拼接,导致结果错误。用locals()取对象比eval()安全性更高、执行效率更好。
内容的提问来源于stack exchange,提问作者SMar3552
相关产品推荐
相关产品推荐

