Un metodo semplice sarebbe quella di assegnare il valore di default prima e quindi eseguire 2 loc
chiamate:
In [66]:
df = pd.DataFrame({'x':[0,-3,5,-1,1]})
df
Out[66]:
x
0 0
1 -3
2 5
3 -1
4 1
In [69]:
df['y'] = 0
df.loc[df['x'] < -2, 'y'] = 1
df.loc[df['x'] > 2, 'y'] = -1
df
Out[69]:
x y
0 0 0
1 -3 1
2 5 -1
3 -1 0
4 1 0
Se si voleva utilizzare np.where
allora si potrebbe farlo con un nidificato np.where
:
In [77]:
df['y'] = np.where(df['x'] < -2 , 1, np.where(df['x'] > 2, -1, 0))
df
Out[77]:
x y
0 0 0
1 -3 1
2 5 -1
3 -1 0
4 1 0
Quindi qui definiamo la prima condizione come dove x è inferiore a -2, restituisce 1, quindi abbiamo un altro np.where
che verifica l'altra condizione dove x è maggiore di 2 e restituisce -1, altrimenti restituisce 0
temporizzazioni
In [79]:
%timeit df['y'] = np.where(df['x'] < -2 , 1, np.where(df['x'] > 2, -1, 0))
1000 loops, best of 3: 1.79 ms per loop
In [81]:
%%timeit
df['y'] = 0
df.loc[df['x'] < -2, 'y'] = 1
df.loc[df['x'] > 2, 'y'] = -1
100 loops, best of 3: 3.27 ms per loop
Quindi, per questo set di dati campione il metodo np.where
è due volte più veloce
Nota, ci sta per essere un altro modo per fare questo con il metodo assign() in panda 16.0 (dovuto da un giorno all'altro?) Simile a dplyr mutate: http://pandas-docs.github.io/pandas-docs-travis/whatsnew.html#dataframe-assign – JohnE