web-dev-qa-db-ja.com

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。エリ

8
eli

applyは一度に1つの行を処理することを目的としているため、列全体を渡しても、機能しません。このような場合は、lambdaを使用するのが最適です。

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

ただし、これを実行するより高速な方法がある可能性があります。 1つの方法は、np.vectorizeを使用することです。もう1つは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
)
9
cs95