如何对pandas DataFrame每行应用exec函数得到预期计算结果?
在Pandas中执行DataFrame行内的表达式字符串并计算结果
问题场景
初始代码如下:
import pandas as pd var = 2.5 df = pd.DataFrame(["var*1", "var*3", "var*5"])
期望得到的计算结果:
0 0 2.5 1 7.5 2 12.5
但尝试以下操作时均遇到问题:
- 使用
df.apply(exec)或df.apply(lambda x:exec(x)),抛出TypeError: exec() arg 1 must be a string, bytes or code object错误 - 使用
df[0].map(lambda x:exec(x)),结果全为None - 自定义函数调用时出现
NameError: name 'var' is not defined错误
解决方案
核心问题在于用错了工具,同时没处理好变量作用域:
1. 替换exec为eval,并传递作用域
exec用于执行语句(比如赋值、循环),不会返回表达式的计算结果;而eval专门用来计算表达式字符串的结果,正好匹配需求。同时通过globals()或自定义字典传递变量,避免作用域问题。
示例代码:
import pandas as pd var = 2.5 df = pd.DataFrame(["var*1", "var*3", "var*5"]) # 计算每行的表达式,传入全局作用域获取var变量 df[0] = df[0].map(lambda x: eval(x, globals())) print(df)
2. 自定义函数封装(可选)
如果需要更清晰的逻辑,可封装成自定义函数:
def compute_expression(expr): # 用globals()获取外部变量,或传入自定义字典更可控 return eval(expr, globals()) df[0] = df[0].apply(compute_expression)
3. 更安全的变量传递方式
如果不想暴露整个全局作用域,可以把需要的变量放到字典中传递,避免意外访问其他变量:
var_dict = {"var": 2.5} df[0] = df[0].map(lambda x: eval(x, var_dict))
注意事项
- 安全风险:
eval会执行任意表达式字符串,如果DataFrame中的内容来自不可信来源(比如用户输入),可能存在代码注入风险,请勿使用该方法 - 确保表达式字符串的格式正确,避免语法错误
内容的提问来源于stack exchange,提问作者Cedric Zoppolo
相关产品推荐
相关产品推荐

