在pandas中的多个列上应用自定义函数

2024-04-29 04:13:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我在“应用”熊猫的自定义函数时遇到问题。当我测试函数时,直接传递它的工作值并正确返回响应。但是,当我试图传递列值时,我收到错误“序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。”

def feez (rides, plan):
    pmt4       = 200
    inc4       = 50  #number rides included
    min_rate4  = 4 

    if plan == "4 Plan":
        if rides > inc4:
            fee = ((rides - inc4) * min_rate4) + pmt4 
        else:
            fee = pmt4
        return (fee)
    else:
       return 0.1

df['fee'].apply(feez(df.total_rides, df.plan_name))

直接传递值有效,即feez(800,“4 Plan”),返回3200

但是,当我尝试应用上面的函数时会收到错误。

我是个新手,怀疑我的语法写得不好。非常感谢你的任何想法。蒂亚。伊莱


Tags: 函数dfreturnif错误minelserides
1条回答
网友
1楼 · 发布于 2024-04-29 04:13:23

apply意味着一次只能处理一行,因此在处理时传递整个列将不起作用。在这些情况下,最好使用lambda

df['fee'] = df.apply(lambda x: feez(x['total_rides'], x['plan_name']), axis=1)

然而,可能有更快的方法来做到这一点。一种方法是使用np.vectorize。另一种是使用np.where

选项1
np.vectorize

v = np.vectorize(feez)
df['fee'] = v(df.total_rides, df.plan_name)

选项2
嵌套np.where

df['fee'] = np.where(
        df.plan_name == "4 Plan", 
        np.where(df.total_rides > inc4, (df.total_rides - inc4) * min_rate4) + pmt4, pmt4), 
        0.1
)

相关问题 更多 >