如何循环处理多个pandas DataFrame?解决NameError未定义变量问题
问题分析与解决方案
我来帮你拆解下代码里的问题,以及怎么修改才能实现你的需求:
核心错误原因
- 循环变量未关联全局变量:你循环里的
i一开始是字符串(比如'a'),后来把它赋值成DataFrame,但这只是改变了循环变量i的值,并没有在全局环境里创建名为a、b的变量,所以最后调用a.info()时会报NameError。 - 文件名拼接错误:
i + 'csv'会生成类似acsv的错误文件名,应该是i + '.csv'才对;同理新文件名建议写成i + '_new.csv',避免出现anew.csv这种不清晰的命名。 - 多余的代码行:
i = pd.DataFrame()完全没必要,因为下一行pd.read_csv会直接覆盖这个空DataFrame。 - 内置类型被覆盖:用
list作为变量名会覆盖Python的内置list类型,这是不好的编程习惯,建议换成df_names这类有意义的名字。
推荐解决方案(用字典管理DataFrame,更规范)
这种方式不会污染全局变量,还能统一管理所有DataFrame,后续操作更方便:
import pandas as pd # 定义要处理的DataFrame名称列表,避免用list做变量名 df_names = ['a', 'b', 'c', 'd', 'e'] # 用字典存储所有DataFrame,方便后续访问 dfs = {} for name in df_names: # 正确读取对应csv文件 current_df = pd.read_csv(f"{name}.csv") # 计算sum列 current_df['sum'] = current_df['Z'] + current_df['Y'] # 保存处理后的文件,index=False避免保存默认索引列 current_df.to_csv(f"{name}_new.csv", index=False) # 将DataFrame存入字典,后续可以通过dfs['a']访问 dfs[name] = current_df # 现在可以查看a的信息了 dfs['a'].info()
如果你一定要创建全局变量a、b、c...(不推荐,易维护性差)
如果坚持要直接用a、b这类变量名,可以通过globals()动态创建全局变量:
import pandas as pd df_names = ['a', 'b', 'c', 'd', 'e'] for name in df_names: current_df = pd.read_csv(f"{name}.csv") current_df['sum'] = current_df['Z'] + current_df['Y'] current_df.to_csv(f"{name}_new.csv", index=False) # 动态创建全局变量,比如把current_df赋值给名为a的变量 globals()[name] = current_df # 现在可以直接调用a.info()了 a.info()
额外注意事项
- 确保你的
.csv文件和脚本在同一个目录下,或者使用完整文件路径(比如pd.read_csv(r"C:\data\a.csv")) - 检查csv文件中确实存在
Z和Y列,否则会触发KeyError - 保存文件时加上
index=False可以避免把Pandas默认的索引列写入csv,除非你需要保留索引
内容的提问来源于stack exchange,提问作者Boon
相关产品推荐
相关产品推荐

