如何使用存储DataFrame名称的列表完成Pandas拼接操作
问题背景
现有存储DataFrame变量名的字符串列表:
name_list = ['df1', 'df2', 'df3']
当前代码环境中已经创建了3个结构完全一致的DataFrame实例:df1、df2、df3,需要直接通过上述列表完成多DataFrame拼接,避免手动编写pd.concat([df1, df2, df3])这类显式枚举所有对象的代码。
前期尝试的两种实现方式均触发报错:
- 方式1:直接传入字符串列表执行拼接
df = pd.concat(name_list)
触发报错:
TypeError: cannot concatenate object of type '<class 'str'>'; only Series and DataFrame objs are valid
- 方式2:通过
globals()获取对象后拼接
df = pd.concat([globals()[i] for i in name_list])
触发报错:
KeyError: 'df1'
报错原因
- 第一种方式报错核心原因:
pd.concat要求传入的可迭代对象元素必须是Series或者DataFrame实例,传入的列表元素是字符串类型,不符合入参要求。 - 第二种方式报错核心原因:
globals()仅能返回当前全局作用域的变量名-对象映射,如果df1/df2/df3定义在函数局部作用域、类作用域,或者是Jupyter类交互环境的隔离单元格作用域中,就无法从globals()中匹配到对应键,触发KeyError。
正确实现方案
方案1:匹配作用域取对象
如果DataFrame定义在局部作用域(比如函数内部),把globals()替换为locals()获取当前局部作用域的变量映射即可:
import pandas as pd def concat_test(): # 局部作用域下的3个DataFrame df1 = pd.DataFrame({'col': [1,2]}) df2 = pd.DataFrame({'col': [3,4]}) df3 = pd.DataFrame({'col': [5,6]}) name_list = ['df1', 'df2', 'df3'] # 从局部作用域取对象拼接,加ignore_index重置索引避免重复 df = pd.concat([locals()[name] for name in name_list], ignore_index=True) return df
如果确认DataFrame在全局作用域,仍触发KeyError,可以先执行print(globals().keys())查看当前全局作用域实际存在的变量名,排查是否存在变量名拼写错误、变量未提前执行定义的问题。
方案2:字典统一管理DataFrame(推荐)
最稳妥的方式是从DataFrame创建阶段就用字典统一存储所有实例,完全规避作用域带来的变量查找问题,也是工程化代码的常用写法:
import pandas as pd # 初始化存储字典 df_container = {} # 把DataFrame存入字典,key和你列表里的字符串对应 df_container['df1'] = pd.DataFrame({'col': [1,2]}) df_container['df2'] = pd.DataFrame({'col': [3,4]}) df_container['df3'] = pd.DataFrame({'col': [5,6]}) name_list = ['df1', 'df2', 'df3'] # 直接从字典取对象拼接,不受任何作用域限制 df = pd.concat([df_container[name] for name in name_list], ignore_index=True)
提示:多DataFrame拼接时建议加上
ignore_index=True参数,自动重置拼接后结果的行索引,避免原索引重复带来的后续处理问题。
内容的提问来源于stack exchange,提问作者Economist Learning Python
相关产品推荐
相关产品推荐

