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

Pandas自定义带参数的ifelse函数并应用至多列生成新计算列

问题原因

你原来的写法报错是因为apply调用自定义函数传参的语法错误,不能直接写ifelsefunction(row, 'feature1'),需要通过args参数传递额外入参,或者用lambda表达式包装。


方案1:适配最初的简化场景

修改后的代码如下:

def ifelsefunction(row, feature):
    if row[feature] >=3:
        return 1
    elif row[feature] ==2:
        return 2
    else:
        return 0

# 单次调用写法:通过args传参
t1['ft1_score'] = t1.apply(ifelsefunction, axis=1, args=('feature1',))
t1['ft2_score'] = t1.apply(ifelsefunction, axis=1, args=('feature2',))
t1['ft3_score'] = t1.apply(ifelsefunction, axis=1, args=('feature3',))

# 批量遍历写法:不用重复写代码
feature_list = ['feature1', 'feature2', 'feature3']
for idx, feat in enumerate(feature_list, 1):
    t1[f'ft{idx}_score'] = t1.apply(ifelsefunction, axis=1, args=(feat,))

方案2:适配补充的实际业务逻辑场景

注意np.select的逻辑判断要使用位运算符&替代and,否则会触发数组布尔值判断报错。推荐直接用向量化操作实现,比行遍历apply的执行效率高很多,代码如下:

import numpy as np

# 可根据实际需求替换var2的取值,示例中var2取固定值6
VAR2 = 6

def calc_score(var1, var2):
    mask1 = (var1 >=3) & (var1 < var2)
    mask2 = var1 == 2
    return np.select([mask1, mask2], [var1*0.7, var1*var2], default=0)

# 批量遍历生成新列
feature_list = ['feature1', 'feature2', 'feature3']
for idx, feat in enumerate(feature_list, 1):
    t1[f'ft{idx}_score'] = calc_score(t1[feat], VAR2)

如果实际场景中var2是DataFrame的某一列,直接传入对应列即可:

# 示例:var2取feature3列的值
feature_list = ['feature1', 'feature2']
for idx, feat in enumerate(feature_list, 1):
    t1[f'ft{idx}_score'] = calc_score(t1[feat], t1['feature3'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:27:04