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

Pandas执行列中写入的运算返回None,求正确解决方案

解决Pandas中动态运算返回None的问题

你遇到的问题根源是exec()函数仅执行字符串中的代码,不会返回运算结果,所以result列全为None。下面提供三种可行的解决方法:

方法1:用eval()替代exec()

eval()会执行表达式并返回结果,直接替换即可解决问题:

import pandas as pd
operation = ["+", "*", "+", "*"]
op_number = ["Op1", "Op2", "Op3", "Op4"]
number_1 =[1,3,5,6] 
number_2 =[2,4,2,3] 

s1 = pd.DataFrame({
    'operation': operation,
    'op_number': op_number,
    'number_1' : number_1,
    'number_2': number_2
})

s1['derived'] = s1['number_1'].astype(str) + " " + s1['operation'] + " " + s1['number_2'].astype(str)
# 用eval替代exec,获取运算结果
s1['result'] = s1['derived'].apply(eval)
print(s1)

注意:如果数据来自不可信的外部源,eval()存在代码注入风险,谨慎使用。

方法2:函数映射(安全可靠)

通过字典将运算符映射到对应的运算函数,避免执行字符串代码的风险,扩展性也更强:

import pandas as pd
from operator import add, mul

operation = ["+", "*", "+", "*"]
op_number = ["Op1", "Op2", "Op3", "Op4"]
number_1 =[1,3,5,6] 
number_2 =[2,4,2,3] 

# 映射运算符到对应运算函数,后续加运算只需扩展字典
op_map = {
    '+': add,
    '*': mul
}

s1 = pd.DataFrame({
    'operation': operation,
    'op_number': op_number,
    'number_1' : number_1,
    'number_2': number_2
})

# 逐行调用对应函数计算结果
s1['result'] = s1.apply(lambda row: op_map[row['operation']](row['number_1'], row['number_2']), axis=1)
print(s1)

方法3:numpy条件判断(高效)

如果只有少数几种运算类型,用numpy的where可以实现高效计算:

import pandas as pd
import numpy as np

operation = ["+", "*", "+", "*"]
op_number = ["Op1", "Op2", "Op3", "Op4"]
number_1 =[1,3,5,6] 
number_2 =[2,4,2,3] 

s1 = pd.DataFrame({
    'operation': operation,
    'op_number': op_number,
    'number_1' : number_1,
    'number_2': number_2
})

# 根据运算类型分支计算
s1['result'] = np.where(
    s1['operation'] == '+',
    s1['number_1'] + s1['number_2'],
    s1['number_1'] * s1['number_2']
)
print(s1)

内容的提问来源于stack exchange,提问作者manuzzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:01:17