2017-10-19 14 views
1

Je suis en train d'exécuter:Utiliser instruction conditionnelle pour soustraire scalaire de la colonne pandas géants df donne ValueError: La valeur de vérité d'une série est ambiguë

if df_trades.loc[:, 'CASH'] != 0: df_trades.loc[:, 'CASH'] -= commission 

puis-je obtenir l'erreur. df_trades.loc[:, 'CASH'] est une colonne de flottants. Je veux soustraire le scalaire commission de chaque entrée dans cette colonne.

Par exemple, df_trades.loc[:, 'CASH'] imprime

2011-01-10 -2557.0000 
2011-01-11  0.0000 
2011-01-12  0.0000 
2011-01-13 -2581.0000 

Si commission est 1, je veux le résultat:

2011-01-10 -2558.0000 
2011-01-11  0.0000 
2011-01-12  0.0000 
2011-01-13 -2582.0000 

Répondre

3

Utilisez np.where

commission = -1 
df['CASH'] = np.where(df['CASH'] != 0, df['CASH'] + commission , df['CASH']) 

ou df.where i.e.

df['CASH'] = df['CASH'].where(df['CASH'] == 0,df['CASH']+commission) 

ou df.mask

df['CASH'] = df['CASH'].mask(df['CASH'] != 0 ,df['CASH']+commission) 
 
Date 
2011-01-10 -2558.0 
2011-01-11  0.0 
2011-01-12  0.0 
2011-01-13 -2582.0 
Name: CASH, dtype: float64 
%%timeit 
commission = -1 
df['CASH'] = np.where(df['CASH'] != 0, df['CASH'] + commission , df['CASH']) 
1000 loops, best of 3: 750 µs per loop 

%%timeit 
df['CASH'].mask(df['CASH'] != 0 ,df['CASH']+commission) 
1000 loops, best of 3: 1.45 ms per loop 

%%timeit 
df['CASH'].where(df['CASH'] == 0,df['CASH']+commission) 
1000 loops, best of 3: 1.55 ms per loop 

%%timeit 
df.loc[df['CASH'] != 0, 'CASH'] += commission 
100 loops, best of 3: 2.37 ms per loop 
+0

est-Numpy ou Pandas plus efficace pour cela? – dirtysocks45

+0

Est-ce que la solution de pshep123 est la même? – dirtysocks45

+0

Oui. Cela fonctionne aussi mais lent. – Dark

1

Cela devrait le faire:

df.loc[df['CASH'] != 0, 'CASH'] -= 1

+0

Est-ce la solution la plus Pythonic étant donné que j'utilise Pandas et Numpy? – dirtysocks45

+0

Je ne suis pas l'arbitre sur le code pythonique, mais cela fonctionne et est propre. Je n'ai pas non plus testé la vitesse, alors donnez-leur un coup et voyez ce qui fonctionne le mieux pour vous. – pshep123