eli*_*eli 8 python function apply dataframe pandas
我在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))
Run Code Online (Sandbox Code Playgroud)
直接传递值,即feez(800,"4 Plan"),返回3200
但是,当我尝试应用上述功能时,我收到错误.
我是新手,怀疑我的语法写得不好.任何想法都非常感激.TIA.礼
apply
意味着一次只能处理一行,所以在你这样做时传递整个列是行不通的.在这些情况下,最好使用a lambda
.
df['fee'] = df.apply(lambda x: feez(x['total_rides'], x['plan_name']), axis=1)
Run Code Online (Sandbox Code Playgroud)
但是,可能有更快的方法来执行此操作.一种方法是使用np.vectorize
.另一种是使用np.where
.
选项1
np.vectorize
v = np.vectorize(feez)
df['fee'] = v(df.total_rides, df.plan_name)
Run Code Online (Sandbox Code Playgroud)
选项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
)
Run Code Online (Sandbox Code Playgroud)