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

