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

如何使用存储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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:06:41