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

如何在Pandas DataFrame中应用两个不同参数的函数生成新列

解决DataFrame中多函数生成列不覆盖的问题

你遇到的核心问题是两次赋值df['LIMS Method']会互相覆盖,而且原函数里还存在未传入参数的bug(函数里的method变量没从行数据里传进去)。下面给你两种靠谱的解决办法:

方法一:先生成初始列,再用另一个函数填充空值

先调用一个函数生成列,然后用另一个函数的结果填充空单元格,这样两个函数的结果就不会互相覆盖了。

首先修正原函数的参数问题,把method作为参数传入:

def lims_method(methid, method):
    if method == 'Totals':
        if methid == '0010/8330B':
            return 'EPA-0010A'
        elif methid == '0010/8270C':
            return 'EPA-0010B'
        elif methid == 'TCO':
            return 'EPA-0010C'
    elif method == 'TCLP':
        # 补全6020对应的返回值,你可以根据实际需求修改
        if methid in ['6010D', '6010C', '6010B', '6020']:
            return 'EPA-1311FULL'

def lims_method8260(meth, matrix, method):
    if method == 'Totals':   
        if meth == '8260_AZ' and matrix == 'SOLID':
            return 'EPA-8260-S'
        elif meth == '8260_AZ' and matrix == 'WATER':
            return 'EPA-8260-U'

然后先调用lims_method生成初始值,再用lims_method8260的结果填充空值:

# 先调用lims_method生成初始列
df['LIMS Method'] = df.apply(lambda x: lims_method(x['Method'], x['method']), axis=1)

# 筛选出空值行,用lims_method8260的结果填充
mask = df['LIMS Method'].isna()
df.loc[mask, 'LIMS Method'] = df[mask].apply(lambda x: lims_method8260(x['Method'], x['Matrix'], x['method']), axis=1)

这样,lims_method处理不了的情况(比如Totals下的8260_AZ)会被lims_method8260的结果填充,TCLP的场景也不会被覆盖。

方法二:合并成一个统一处理函数

把两个函数的逻辑整合到一个函数里,一次apply完成生成,避免多次赋值覆盖:

def get_lims_method(methid, matrix, method):
    # 先处理原lims_method的逻辑
    if method == 'Totals':
        if methid == '0010/8330B':
            return 'EPA-0010A'
        elif methid == '0010/8270C':
            return 'EPA-0010B'
        elif methid == 'TCO':
            return 'EPA-0010C'
        # 再处理8260的专属逻辑
        elif methid == '8260_AZ':
            if matrix == 'SOLID':
                return 'EPA-8260-S'
            elif matrix == 'WATER':
                return 'EPA-8260-U'
    elif method == 'TCLP':
        if methid in ['6010D', '6010C', '6010B', '6020']:
            return 'EPA-1311FULL'

# 一次apply生成目标列
df['LIMS Method'] = df.apply(lambda x: get_lims_method(x['Method'], x['Matrix'], x['method']), axis=1)

这种方法逻辑更集中,后续维护和修改也更方便。

注意:原代码里lims_method中methid == '6020'的分支没有返回值,记得补充对应的结果,否则会出现空值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:44:53