2017-10-16 3 views
0

Ich habe einen Datenrahmen, der je nach Wert der Spalte Order ich den Wert der Spalte Value nehmen und einige Berechnungen vornehmen möchte.Anwenden von Lambda abhängig von den Spaltenwerten auf Pandas

DataFrame1

   Order Shares Value 
2011-01-10 BUY 1300  340.99 
2011-01-10 SELL 1200  340.99 
2011-01-11 SELL 1100  330.99 

Codezeile:

impacts['NewValue']=float(impacts.Order.apply(lambda x: (impacts.Value + (impacts.Value * 0.006)) if x == 'SELL' else (impacts.Value - (impacts.Value * 0.006)))) 

Fehler:

Typeerror: ufunc 'mehrfach' enthalten nicht eine Schleife mit Signatur passenden Typen dtype (‘ S32 ') dtype (' S32 ') dtype (' S32 ')

Ist mein Verständnis, dass Fehler durch den Inhalt der Zahlen verursacht wird, deshalb habe ich versucht, es zu einem Float zu werfen.

Intended Ausgang

  Order Shares Value NewValue 
2011-01-10 BUY 1300 340.99 338.94 
2011-01-10 SELL 1200 340.99 343.03 
2011-01-11 SELL 1100 330.99 332.97 

Jede Hilfe ist mehr als willkommen. Vielen Dank!

Antwort

1

Hoffe, es :-) helfen (Modified nur Ihren eigenen Code, Ihr Beispielcode Fehler zurück)

df.apply(lambda x: (x.Value + (x.Value * 0.006)) if x.Order == 'SELL' else (x.Value - (x.Value * 0.006)),axis=1) 
Out[790]: 
2011-01-10 338.94406 
2011-01-10 343.03594 
2011-01-11 332.97594 
dtype: float64 

Um df

df['NewValue']=df.apply(lambda x: (x.Value + (x.Value * 0.006)) if x.Order == 'SELL' else (x.Value - (x.Value * 0.006)),axis=1) 
df 
Out[792]: 
      Order Shares Value NewValue 
2011-01-10 BUY 1300 340.99 338.94406 
2011-01-10 SELL 1200 340.99 343.03594 
2011-01-11 SELL 1100 330.99 332.97594 

I np.where

verwenden zu erhalten
import numpy as np 
np.where(df.Order=='SELL',(df.Value + (df.Value * 0.006)),(df.Value - (df.Value * 0.006))) 
Out[794]: array([ 338.94406, 343.03594, 332.97594]) 

es nach zuweisen zurück

df['NewValue']=np.where(df.Order=='SELL',(df.Value + (df.Value * 0.006)),(df.Value - (df.Value * 0.006))) 
df 
Out[796]: 
      Order Shares Value NewValue 
2011-01-10 BUY 1300 340.99 338.94406 
2011-01-10 SELL 1200 340.99 343.03594 
2011-01-11 SELL 1100 330.99 332.97594 
+0

Sie sind die Besten, vielen Dank. –

+0

@Codinghierarchy Wenn es hilft, können Sie es akzeptieren ~ :) – Wen

1

(zu lang für einen Kommentar) Hier ist eine etwas gekürzte Version Wens np.where:

i = np.where(df.Order == 'SELL', 1, -1) * 0.006 
df.Value = df.Value.mul(i) + df.Value 

print(df.Value) 
2011-01-10 338.94406 
2011-01-10 343.03594 
2011-01-11 332.97594 
dtype: float64 

Verwenden df.Order das Schild vor der Operation zu bestimmen.

+1

Vielen Dank COLDSPEED. Ich lerne viel. –

Verwandte Themen