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

Python pandas:DataFrame列表创建与遍历报错问题求助

问题解答

1. 两种列表执行效果不同的原因

%who_ls DataFrame返回的是字符串类型的变量名称列表,比如['GB_SF_NZ', 'GF_1', 'H_2_S_Z']里的每个元素都是代表变量名的字符串,并非实际的DataFrame对象。遍历这个列表时,df变量拿到的是字符串,调用.rename()自然会报错——字符串没有该方法。

而手动创建的[GB_SF_NZ, GF_1, H_2_S_Z]是直接引用了全局变量中的DataFrame对象,列表内每个元素都是真实的pandas DataFrame实例,因此调用.rename()能正常执行。

2. 创建DataFrame对象列表的方法

方法1:直接从原字典提取(推荐)

你读取Excel后得到的字典中,value本身就是DataFrame对象,直接提取values转成列表即可,无需将变量放入全局环境,管理更清晰:

import pandas as pd
import re

# 读取Excel,得到工作表名与对应DataFrame的字典
sheet_dfs = pd.read_excel('Book1.xlsx', sheet_name=None)
# 替换工作表名中的特殊字符
sheet_dfs = {re.sub(r"[-+\s]", "_", k): v for k, v in sheet_dfs.items()}
# 直接获取所有DataFrame对象的列表
all_dfs = list(sheet_dfs.values())

# 遍历执行重命名操作
for df in all_dfs:
    df.rename(columns=df.iloc[2], inplace=True)

方法2:从全局变量中提取(适合已创建全局变量的场景)

如果已经通过globals()[key] = df[key]生成了全局变量,可通过变量名字符串匹配获取对应对象:

# 在IPython/Jupyter环境中,先拿到变量名字符串列表
name_list = %who_ls DataFrame
# 转换为DataFrame对象列表
all_dfs = [globals()[name] for name in name_list]

# 遍历执行重命名操作
for df in all_dfs:
    df.rename(columns=df.iloc[2], inplace=True)

如果是普通Python脚本(非IPython环境),无法使用%who_ls,可通过筛选全局变量的类型获取:

import pandas as pd

# 筛选全局环境中所有DataFrame类型的对象
all_dfs = [v for k, v in globals().items() if isinstance(v, pd.DataFrame)]

# 遍历执行重命名操作
for df in all_dfs:
    df.rename(columns=df.iloc[2], inplace=True)

内容的提问来源于stack exchange,提问作者Steve..Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:55:16