如何动态为pandas DataFrame指定变量名并修复现有赋值代码
问题原因
原代码的核心错误是:在f字符串中直接嵌入pandas DataFrame实例时,会将DataFrame的打印内容(表格形式的字符串)拼接到执行语句中,无法被exec识别为合法的Python对象,导致赋值失败。同时如果需要在run()函数外部访问这三个变量,默认的局部变量赋值也无法生效。
最优修改方案(不使用exec,更安全)
直接操作全局变量字典globals()完成动态赋值,代码可读性和安全性都更高:
import pandas as pd def run(): dataframe = { "Values": [1, 2, 3, 4], "Montly PnL": [10, 2, 2, 1], "Long Montly PnL": [232, 12, 3, 4], "Short Montly PnL": [21, 2, 1, 5], } Up_dataframe = { "Values": [1, 2, 3, 4], "Montly PnL": [55, 6, 5, 5], "Long Montly PnL": [1, 4, 22, 4], "Short Montly PnL": [5, 2, 1, 4], } Down_dataframe = { "Values": [1, 2, 3, 4], "Montly PnL": [4, 2, 23, 12], "Long Montly PnL": [221, 45, 2, 1], "Short Montly PnL": [1, 6, 2, 44], } # 构造变量名和对应源数据的映射关系 var_map = { "df_dataframe": dataframe, "UP_dataframe": Up_dataframe, "Down_dataframe": Down_dataframe } for var_name, raw_data in var_map.items(): # 直接给全局变量字典赋值,函数外部可直接访问对应变量 globals()[var_name] = pd.DataFrame(data=raw_data).set_index('Values') run()
运行后你就可以直接在全局环境调用df_dataframe、UP_dataframe、Down_dataframe三个变量,得到符合预期的DataFrame结果。
若必须使用exec的修改方案
如果确实需要使用exec实现,需要避免DataFrame实例直接转字符串的问题,调整写法如下:
# 原循环部分替换为以下代码 for k, v in zip( ["df_dataframe", "UP_dataframe", "Down_dataframe"], [dataframe, Up_dataframe, Down_dataframe], ): # 将v传入exec的局部命名空间,在exec内部完成DataFrame构造 exec(f"{k} = pd.DataFrame(data=v).set_index('Values')", globals(), {'v': v})
内容的提问来源于stack exchange,提问作者georgehere
相关产品推荐
相关产品推荐

