我无法在Pandas中“应用”自定义功能。当我测试函数时,直接传递它的工作值并正确返回响应。但是,当我尝试传递列值时,我收到错误“系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a。所有()。“
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
但是,当我尝试应用上述功能时,我收到错误。
我是新手并且怀疑我的语法编写得很糟糕。任何想法都非常感激。 TIA。利
答案 0 :(得分:7)
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
)