Python循环中使用F-string遇KeyError,如何正确存储误差指标?
问题分析与解决办法
核心错误点
- 列名生成错误:你写的
"f'Price_REG{j}'"是把整段字符串当作列名,而非动态生成Price_REG1/Price_REG2这类真实列名,导致Python找不到对应列报KeyError。 - 动态DataFrame调用错误:
f'df_test_{i}'是字符串,不是实际的DataFrame变量,Python不会自动将字符串解析为变量名。 - 命名冲突:用
mae作为变量名,会覆盖导入的mean_absolute_error函数(或别名mae),导致后续调用函数时出错。
修正后的代码(用字典存储结果,方便后续调用)
# 确保导入所需的指标计算函数 from sklearn.metrics import mean_squared_error, mean_absolute_error # 先把所有需要用到的df_test_xxx存入字典,避免动态变量名的坑 test_dataframes = { '24': df_test_24, '168': df_test_168, 'standard': df_test_standard, 'custom': df_test_custom } # 用字典存储误差指标,键名明确对应每个指标的来源 error_results = {} naive_list = ['24', '168', 'standard', 'custom'] for i in naive_list: # 从字典中取出当前循环对应的DataFrame current_df = test_dataframes[i] for j in range(1, 5): # 正确生成列名:Price_REG1、Price_REG2... column_name = f"Price_REG{j}" # 计算指标,变量名避免和函数重名 rmse_value = mean_squared_error(df_test[column_name], current_df[column_name], squared=False) mae_value = mean_absolute_error(df_test[column_name], current_df[column_name]) # 将结果存入字典,键名格式为"指标_类型_编号" error_results[f'rmse_{i}_{j}'] = rmse_value error_results[f'mae_{i}_{j}'] = mae_value # 后续调用示例:获取custom类型下REG3的MAE # print(error_results['mae_custom_3'])
补充说明
- 如果坚持用列表存储,可以把每个指标和对应的标识打包成元组存入,比如:
error_list = [] # ... 循环部分同上 ... error_list.append(('rmse', i, j, rmse_value)) error_list.append(('mae', i, j, mae_value))
这样后续可以通过遍历列表筛选需要的指标,但字典的可读性和调用便捷性更强。
- 不要用
globals()或locals()去动态获取变量名(比如globals()[f'df_test_{i}']),这种方式不安全,且代码可读性差,用字典统一管理是更规范的做法。
内容的提问来源于stack exchange,提问作者user20050294
相关产品推荐
相关产品推荐

