如何在Pandas DataFrame列中解析并计算字符串形式的表达式
如何计算DataFrame中每行字符串形式的表达式?
我明白你的问题了——当你想用eval()计算DataFrame每行calc列里的表达式时,直接调用它会找不到列名对应的变量,因为eval默认是在全局/局部命名空间里查找,而不是每行的DataFrame行数据中。下面给你几个可行的解决办法:
方法一:用apply结合eval传递行变量
我们可以定义一个函数,把每行的数据转成字典,作为eval的局部变量传入,这样表达式里的a、b就能匹配到当前行对应列的值了:
import pandas as pd calcs = {'a': [1,1], 'b': [1,1], 'c': [1,1], 'calc': ['a*b','a+b']} df = pd.DataFrame(calcs) def calculate_row(row): # 将行数据转为字典,作为eval的局部变量环境 return eval(row['calc'], globals(), row.to_dict()) # 对每行应用计算函数 df['result'] = df.apply(calculate_row, axis=1) print(df)
运行后你会得到预期的结果:
a b c calc result 0 1 1 1 a*b 1 1 1 1 1 a+b 2
方法二:用列表推导式简化代码
如果觉得定义函数有点繁琐,也可以用列表推导式直接遍历每行数据,代码更简洁:
df['result'] = [eval(expr, globals(), row) for expr, row in zip(df['calc'], df.to_dict('records'))]
这里df.to_dict('records')会把DataFrame转换成一个字典列表,每个字典对应一行的键值对,再和calc列的表达式一一配对传入eval。
重要提醒
注意:eval()会执行任意字符串代码,如果你的calc列数据来自不可信的外部来源,这个方法存在安全风险。这种情况下,建议先对表达式内容做严格校验,或者使用更安全的表达式解析库(比如sympy来处理数学表达式)。
内容的提问来源于stack exchange,提问作者CMASolutions
相关产品推荐
相关产品推荐

