You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 21:10:45