Python:如何将存储DataFrame变量名的字符串列表转为可用于pd.concat的对象
核心问题说明
你当前的list_2存储的是字符串形式的变量名,而pd.concat仅接收实际的DataFrame/Series对象作为输入,直接传入字符串列表会触发类型错误,完全无法完成拼接。你现在写的pd.concat([*list_2], axis=1)解包后传入的全是类似"table_2_1_1"的字符串,pandas无法自动通过字符串找到对应的变量实体。
两种可落地的修正方案
方案1:去掉冗余的动态变量生成逻辑(推荐)
你现在循环里用vars()动态创建零散变量名、再把变量名字符串存进列表的操作完全是多余环节,直接把循环里获取到的DataFrame对象存入列表即可:
list_1 = ["1", "2", "3", "4"] df_storage = [] for x in list_1: # 直接拿到table对象转成的DataFrame,存入列表 current_df = table_2_1.table(x) df_storage.append(current_df) # 直接把对象列表传给concat即可完成拼接 table21 = pd.concat(df_storage, axis=1)
这种写法不会污染全局命名空间,逻辑更简洁,也不会出现字符串和实际对象脱节的问题。
方案2:如果必须保留原有动态生成变量的逻辑
如果之前的代码已经生成了一批零散的table_2_1_x命名空间变量,可以通过全局命名空间的字典,根据存储的字符串变量名取出对应的真实DataFrame对象:
list_1 = ["1", "2", "3", "4"] list_2 = [] for x in list_1: vars()['table_2_1_' + x] = table_2_1.table(x) list_2.append('table_2_1_' + x) # 根据字符串变量名,从全局命名空间取出对应的真实DataFrame对象 target_dfs = [globals()[var_name] for var_name in list_2] table21 = pd.concat(target_dfs, axis=1)
注意事项
- 不要把变量名字符串直接传给
pd.concat,函数本身没有根据字符串自动搜索对应变量的内置逻辑。 - 不推荐长期使用动态生成零散命名变量的写法,这类写法会让代码可读性大幅下降,后续排查问题难度很高,优先用列表/字典统一存储对象更稳妥。
内容的提问来源于stack exchange,提问作者an1uk
相关产品推荐
相关产品推荐

