2017-10-16 4 views
0

J'ai une trame de données qui en fonction de la valeur de la colonne Order Je veux prendre la valeur de la colonne Value et faire un peu de calcul.Appliquer lambda en fonction des valeurs de colonne sur 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 

ligne de code:

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

Erreur:

TypeError: 'multiplication' ufunc ne contenait pas une boucle avec des types correspondant à des signatures DTYPE (» S32 ') dtype (' S32 ') dtype (' S32 ')

Est-ce que je comprends que l'erreur est causée par le contenu des nombres, c'est pourquoi j'ai essayé de le lancer sur un flotteur.

sortie DESTINÉ

  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 

Toute aide est plus que bienvenue. Merci!

Répondre

1

aider :-) Je espère que ça (Modifiée votre propre code seulement, votre exemple de code renvoie une erreur)

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 

Pour 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 

Je vais utiliser np.where

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

Après assignez en arrière

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

Vous êtes le meilleur, merci beaucoup. –

+0

@Codinghierarchy si cela aide, vous pouvez l'accepter ~ :) – Wen

1

(trop long pour un commentaire) Voici une version légèrement plus condensée de Wen 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 

Utilisez df.Order pour déterminer le signe avant l'opération.

+1

Merci beaucoup COLDSPEED. J'apprends beaucoup. –