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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:27:05