2017-01-02 2 views
1

Lassen Sie uns als Beispiel mit diesem einfachen Datensatzes an:Lambdas Syntaxfehler mit, wenn

example_set = pd.DataFrame(data = {"dirr":[1,0,-1,-1,1,-1,0], 
            "value": [125,130,80,8,150,251,18], 
            "result":[np.NaN for _ in range(7)]}) 

Die folgende Zeile gibt error:invalid syntax

example_set["result"].apply(lambda x : example_set["value"]if x["dirr"]==1) 

Kann mir jemand sagen, was ich falsch mache? Bitte kommen Sie nicht mit der Lösung, wie es ohne lambda zu tun: Dies ist nur ein super vereinfachtes Beispiel, dass ich mein Problem isoliert zu isolieren.

+0

@EdChum Bitte lesen Sie die Frage vollständig: * Bitte kommen Sie nicht mit Lösung, wie es ohne Lambdas tun: Dies ist nur ein super vereinfachtes Beispiel, dass ich mein Problem zu isolieren. * –

+0

'.apply (Lambda x : example_set ["value"] wenn x ["dirr"] == 1 else x) '? – MYGz

+0

@MYGz dies gibt einen weiteren Fehler zurück: 'TypeError: 'float' Objekt ist nicht einklagbar' –

Antwort

4

Sie müssen den else Rückgabewert in der Lambda-Anweisung enthalten:

In [7]: 
example_set['result'] = example_set.apply(lambda x: x['value'] if x['dirr'] == 1 else x['result'], axis = 1) 
example_set 

Out[7]: 
    dirr result value 
0  1 125.0 125 
1  0  NaN 130 
2 -1  NaN  80 
3 -1  NaN  8 
4  1 150.0 150 
5 -1  NaN 251 
6  0  NaN  18 

Ihr Versuch:

example_set["result"].apply(lambda x : example_set["value"]if x["dirr"]==1) 

fehlte die else Rückgabewert im Wesentlichen auch benötigt man x['value'] nicht die ganze df das Verwenden des gesamten df ergibt ein merkwürdiges und unerwünschtes Ergebnis, selbst wenn die Aussage korrigiert wurde:

In [14]: 
example_set.apply(lambda x: example_set['value'] if x['dirr'] == 1 else example_set['result'], axis = 1) 

Out[14]: 
     0  1  2 3  4  5  6 
0 125.0 130.0 80.0 8.0 150.0 251.0 18.0 
1 NaN NaN NaN NaN NaN NaN NaN 
2 NaN NaN NaN NaN NaN NaN NaN 
3 NaN NaN NaN NaN NaN NaN NaN 
4 125.0 130.0 80.0 8.0 150.0 251.0 18.0 
5 NaN NaN NaN NaN NaN NaN NaN 
6 NaN NaN NaN NaN NaN NaN NaN 
+0

Sie können auch nicht auf die entsprechenden Werte anderer Spalten zugreifen, wenn Sie' .apply() 'auf eine einzelne Spalte anwenden. Wahr? – MYGz

+0

@MYGz ja, das ist richtig, per Definition würde es die 'Series' Version nennen, die keinen' axis' Parameter hat, nur die 'DataFrame.apply' Version hat' axis' Parameter – EdChum