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
相关产品推荐
相关产品推荐

