2015-03-06 19 views
9

Se ho un dataframe df con la colonna x e voglio creare colonna y sulla base di valori di x che utilizzano questo pseudo codiceassegnazione vectorize condizionale in panda dataframe

if df['x'] <-2 then df['y'] = 1 
else if df['x'] > 2 then df['y']= -1 
else df['y'] = 0 

come vorrei raggiungere questo obiettivo. Presumo che np.where sia il modo migliore per farlo, ma non sono sicuro di come codificarlo correttamente.

+0

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

risposta

14

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

+0

che ha senso, grazie – azuric