2017-01-31 9 views
3

Ich versuche, Lambda und Map zu verwenden, um eine neue Spalte in meinem Dataframe zu erstellen. Im Wesentlichen nimmt die neue Spalte Spalte A an, wenn ein Kriterium erfüllt ist, und Spalte B ist das Kriterium, das nicht erfüllt ist. Bitte beachten Sie meinen Code unten.Verketten mit Lambda und Bedingungen

df['LS'] = df.['Long'].map(lambda y:df.Currency if y>0 else df.StartDate) 

Wenn ich dies tun, die Funktion gibt jedoch die gesamte Spalte auf jedes Element in meiner neuen Spalte.

In Englisch gehe ich jedes Element y in Spalte Long durch. Wenn der Artikel> 0 ist, nehmen Sie den y-ten Wert in der Spalte "Währung". Andernfalls nehmen Sie den y-ten Wert in der Spalte "Start".

Iteration ist extrem langsam beim Ausführen der oben genannten. Gibt es noch andere Möglichkeiten?

Danke! James

+0

'df [...]' ist ein Syntaxfehler. Sind Sie sicher, dass dies genau der Code ist, den Sie ausführen? – mkrieger1

+1

IIUC du willst 'df ['LS'] = df ['Währung'] where (df ['Long']> 0, df ['StartDate'])' – EdChum

Antwort

1

Just do

df['LS']=np.where(df.Long>0,df.Currency,df.StartDate) 

die den guten vectored Ansatz.

df.Long.map gelten für jede Zeile, aber tatsächlich zurück df.State oder df.current, die Serie sind.

Ein anderer Ansatz ist zu berücksichtigen:

df.apply(lambda row : row[1] if row[0]>0 else row[2],1) 

wird auch mit df.columns=Index(['Long', 'Currency', 'StartDate', ...])

arbeiten, aber es ist kein vektorisiert Ansatz, so ist es langsam. (200x langsamer für 1000 Zeilen in diesem Fall).

0

Sie können das gleiche tun where mit:.

df['LS'] = df['Currency'].where(df['Long']>0,df['StartDate']) 
Verwandte Themen