2017-11-18 6 views
1

Ich habe Probleme, eine benutzerdefinierte Funktion in Pandas "anzuwenden". Wenn ich die Funktion teste, übergebe ich direkt die Werte und die Antwort wird korrekt zurückgegeben. Wenn ich jedoch versuche, die Spaltenwerte zu übergeben, erhalte ich den Fehler "Der Wahrheitswert einer Serie ist mehrdeutig. Verwenden Sie a.empty, a.bool(), a.item(), a.any() oder a. alle()."Benutzerdefinierte Funktion in Pandas anwenden, Werte mehrere Spalten übergeben

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)) 

die Werte Passing direkt arbeitet, das heißt Feez (800, "4-Plan"), kehrt 3200

Allerdings habe ich eine Fehlermeldung erhalten, wenn ich versuche, die Funktion über anzuwenden.

Ich bin ein Neuling und vermute, dass meine Syntax schlecht geschrieben ist. Irgendwelche Ideen sehr geschätzt. TIA. Eli

Antwort

1

apply ist für die Arbeit an einer Reihe zu einer Zeit, so dass die gesamte Spalte während Sie dies tun wird nicht funktionieren. In diesen Fällen ist es am besten, einen lambda zu verwenden.

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

Es gibt jedoch möglicherweise schnellere Möglichkeiten, dies zu tun. Eine Möglichkeit ist die Verwendung von np.vectorize. Der andere verwendet np.where.

Option 1
np.vectorize

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

Option 2
Nested 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 
) 
+0

Vectorize gut funktioniert, danke. – eli

+0

Der Lambda warf Fehler, sehr interessiert, wenn Sie wissen warum? Datei "C: \ Benutzer \ runner \ Anaconda3 \ lib \ site-packages \ Pandas \ core \ frame.py", Linie 4950, in _apply_standard Ergebnisse [i] = func (v) Datei „ ", Zeile 1, in gett ['Gebühr'] = gett.apply (Lambda x: Gebühr (x ['total_rides'], x ['plan_name']))) Datei" C : \ Benutzer \ runner \ Anaconda3 \ lib \ site-packages \ pandas \ core \ series.py ", Zeile 623, in __getitem__ result = self.index.get_value (self, Schlüssel) – eli

+0

Ich habe die" axis = 1 "hinzugefügt Parameter zur lamdba-Lösung, es funktioniert auch. Nochmals vielen Dank für die Klärung und Ideen. – eli

Verwandte Themen