2014-07-16 3 views
5

Ich habe einen Datensatz, df, mit zwei Variablen, x und y. Ich möchte eine Funktion schreiben, macht folgendes:Wie schreibe ich eine Lambda-Funktion, die in Python von zwei Variablen (Spalten) abhängig ist

x wenn x> 100 und y < 50 sonst y

Ich bin es gewohnt, Datenanalyse in STATA Dabei bin ich relativ neu Pandas für die Datenanalyse. Wenn es hilft, in Stata würde es wie folgt aussehen:

ersetzen x = cond (x> 100 & y < 50, x, y)

Mit anderen Worten, die Funktion ist davon abhängig zwei Spalten in df und gibt einen Wert von einer Variablen oder der anderen in jeder Zeile zurück, abhängig davon, ob die Bedingung erfüllt ist.

Bisher habe ich wie neue Variablen durch neue Funktionen wurden zu erstellen:

df.dummyVar = df.x.apply (lambda x: 1, wenn x> 100 sonst 0)

Mit StackOverflow und der Dokumentation konnte ich nur herausfinden, wie man eine Funktion in Abhängigkeit von einer einzelnen Variablen auf mehr als eine Spalte anwendet (mit der Option axis). Bitte helfen Sie.

Antwort

11

Verwendung where:

df['dummyVar '] = df['x'].where((df['x'] > 100) & (df['y'] < 50), df['y']) 

Dies wird schneller sein viel als eine Operation anwenden, wie es ist vektorisiert.

+0

Genau das habe ich gebraucht. Und das ist großartig, weil ich schon sehen kann, wie ich es auf 3 oder mehr Variablen zu Bedingungen erweitern kann. Vielen Dank! – seeiespi

+0

@seeiespi Sie sind willkommen, Sie können dies als Antwort akzeptieren, wird es ein Häkchen unter den Abstimmknöpfen sein. Die Verwendung von apply und iterating sollte immer die letzte Wahl sein, wenn möglich eine Methode finden, die auf dem gesamten Datenrahmen funktioniert – EdChum

5

So:

f = lambda x, y: x if x>100 and y<50 else y 

Lambda (s) in Python ist äquivalent zu einer normalen Funktionsdefinition.

def f(x, y): 
    return x if x>100 and y<50 else y 

NB: Der Körper eines Lambda muss ein gültiger Ausdruck sein. Dies bedeutet, dass Sie keine Dinge wie: return zum Beispiel verwenden können; Ein Lambda gibt den letzten ausgewerteten Ausdruck zurück.

Für einige gute Lektüre siehe:

+0

Ich hatte tatsächlich eine Funktion wie diese geschrieben, konnte aber nicht implementieren, so dass es durch jede Zeile ohne Schleife durchlaufen würde. Die Antwort von EdChum macht genau das. Wenn Sie einen Weg kennen, wie Sie diese definierte Funktion nutzen können, bin ich mir sicher, dass ich das in Zukunft nutzen könnte. Vielen Dank für Ihre Eingabe :) – seeiespi

+0

@seeiespi Sie haben ursprünglich gefragt: "Wie erstelle ich eine Lambda-Funktion, die zwei Argumente benötigt?" - Das ist wie :) - EdChum hat Ihnen eine Antwort gegeben, die mehr mit Ihren Absichten und Pandas übereinstimmt. –

Verwandte Themen