Excel参数表存储函数字符串调用失败 eval返回None的解决方案求解
问题根因
你的代码返回None的核心原因是判断条件和实际存储的空值标识不匹配:
你在sdtm参数列表里,没有固定值/不需要调用函数的位置用的是None,但代码里判断的是v[1] != 'NULL'、v[3] != 'NULL',None和字符串'NULL'并不相等,所以所有需要从原字段取数、需要调用函数的逻辑分支完全没有触发,直接走了赋值v[1](也就是None)的逻辑。
此外不推荐用eval执行函数调用,既存在注入风险,也容易出现参数拼接的语法错误,更稳妥的方案是用映射字典关联字符串函数名和实际函数对象。
修复方案
方法1:修正判断逻辑+使用函数映射(推荐)
按列处理代替双层逐行遍历,性能比原写法提升数倍,尤其适合数据量较大的场景:
import pandas as pd def Patient(pat_ide): return '0' + str(pat_ide[4:]) def Sex(code): return 'M' if code == 1 else 'F' # 建立函数名字符串到函数对象的映射字典 func_map = { 'Patient': Patient, 'Sex': Sex } sdtm = [ ('STUDYID','01-COV',None,None), ('DOMAIN','DM',None,None), ('USUBJID',None,'pat_ide',None), ('SUBJID',None,'pat_ide','Patient'), ('SEX',None,'dem_sex','Sex') ] for col_name, fixed_val, raw_col, func_name in sdtm: if fixed_val is not None: df[col_name] = fixed_val else: if func_name is not None: df[col_name] = df[raw_col].apply(func_map[func_name]) else: df[col_name] = df[raw_col]
方法2:兼容原写法的最小修改(极不推荐,仅做参考)
如果一定要保留原双层遍历+eval的写法,仅修正判断条件即可:
for v in sdtm: for index, row in df.iterrows(): # 将判断字符串'NULL'改为判断None,和配置表的空值标识对齐 if v[1] is not None: df.loc[index, v[0]] = v[1] else: if v[3] is not None: df.loc[index, v[0]] = eval(f'{v[3]}({row[v[2]]})') else: df.loc[index, v[0]] = row[v[2]]
内容的提问来源于stack exchange,提问作者Mereva
相关产品推荐
相关产品推荐

