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
相关产品推荐
相关产品推荐

