パンダでカスタム関数を「適用」することに問題があります。関数をテストすると、値を直接渡して機能し、正しく応答が返されます。しかし、列の値を渡そうとすると、「シリーズの真理値があいまいです。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。エリ
apply
は一度に1つの行を処理することを目的としているため、列全体を渡しても、機能しません。このような場合は、lambda
を使用するのが最適です。
df['fee'] = df.apply(lambda x: feez(x['total_rides'], x['plan_name']), axis=1)
ただし、これを実行するより高速な方法がある可能性があります。 1つの方法は、np.vectorize
を使用することです。もう1つはnp.where
を使用しています。
オプション1np.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
)