Python 循环中如何通过字符串名称获取对应DataFrame执行计算
报错核心原因
你目前拼接得到的dfa/dfb/dfc只是普通字符串,不是对应名称的DataFrame对象,直接对字符串做列索引操作会直接抛出KeyError,根本无法完成计算。要实现“通过和DataFrame完全同名的字符串匹配对应对象”,可以用以下两种适配Python 3.8.5新手的实现方案:
方案1:利用内置作用域字典直接映射
Python运行时会把当前环境下定义的所有变量,存在内置的全局/局部变量字典中,刚好可以实现字符串到对象的映射:
- 如果你的所有
df1_xx/df2_xx/df3_xx类型的DataFrame是在全局环境直接定义的,就用globals()返回的字典做映射——这个字典的键就是变量名的字符串,值就是对应的实际对象,完全匹配你的使用场景。 - 修改后的可运行代码:
dfsteps = ['0','1','10','20','30','40','50','60','70','80','90','100'] # 提前获取全局变量字典,避免循环内反复调用增加开销 global_env = globals() # 准备空字典存储每轮的计算结果,避免循环变量被下一轮覆盖 max_result = {} for steps in dfsteps: # 从全局变量字典中取出对应名称的DataFrame dfa = global_env['df1_' + steps] dfb = global_env['df2_' + steps] dfc = global_env['df3_' + steps] A1 = dfa['Values1'] A2 = dfb['Values2'] A3 = dfc['Values3'] A1max = A1.max() A2max = A2.max() A3max = A3.max() # 存储当前steps对应的三个最大值 max_result[steps] = (A1max, A2max, A3max)
- 注意:如果你的DataFrame是在函数内部定义的局部变量,只要把代码里的
globals()替换成locals()即可,用法完全一致。
方案2:提前手动建立映射字典(更推荐)
这种写法比依赖作用域字典更可控,不会因为变量名拼错、作用域错位出现找不到对象的问题,稳定性更高,适合后续维护:
- 在所有DataFrame定义完成后,直接手动建立“名称字符串- DataFrame对象”的映射关系:
# 提前定义映射字典,键就是循环时用到的steps值,值是对应三个DataFrame的元组 df_map = { '0': (df1_0, df2_0, df3_0), '1': (df1_1, df2_1, df3_1), '10': (df1_10, df2_10, df3_10), # 后续按照格式补全剩下的20/30...100对应的条目即可 }
- 循环时直接从这个字典里取值运算即可,代码更简洁,出错概率更低。
新手避坑提示
- 不要用
eval()实现字符串转对象的操作,比如写eval('df1_' + steps),虽然能跑通,但一旦拼接的字符串存在语法错误,会直接执行对应代码,排查问题难度很高,不推荐使用。 - 不要直接用同名变量存储每轮的最大值,不然循环跑完只会保留最后一个steps对应的计算结果,记得用独立的字典或列表存好每轮的计算结果。
内容的提问来源于stack exchange,提问作者Sud
相关产品推荐
相关产品推荐

