2015-03-19 8 views
6

Ho un dataframe come questo:panda: Utilizzare if-else per popolare nuova colonna

col1  col2  
    1   0 
    0   1 
    0   0 
    0   0 
    3   3 
    2   0 
    0   4 

vorrei aggiungere una colonna che è un 1 se col2 è> 0 o 0 altrimenti. Se stavo usando R vorrei fare qualcosa come

df1[,'col3'] <- ifelse(df1$col2 > 0, 1, 0) 

Come farei questo in python/panda?

+0

La domanda su come aggiungere una colonna o su come utilizzare la sintassi 'var = 1 if condition else 0'? – TigerhawkT3

+0

@ TigerhawkT3: entrambi – screechOwl

risposta

8

si potrebbe convertire la serie booleano df.col2 > 0 ad una serie di numeri interi (True diventa 1 e False diventa 0):

df['col3'] = (df.col2 > 0).astype('int') 

(Per creare una nuova colonna, è sufficiente un nome e assegnarlo a un . Serie, array o lista della stessa lunghezza come la vostra dataframe)

Questo produce col3 come:

col2 col3 
0  0  0 
1  1  1 
2  0  0 
3  0  0 
4  3  1 
5  0  0 
6  4  1 

Un altro modo per creare la colonna potrebbe essere quello di utilizzare np.where, che consente di specificare un valore per uno dei valori true o false ed è forse più vicino alla sintassi della funzione R ifelse. Ad esempio:

>>> np.where(df['col2'] > 0, 4, -1) 
array([-1, 4, -1, -1, 4, -1, 4]) 
1

Presumo che si stia utilizzando Panda (a causa della notazione "df"). In tal caso, puoi assegnare a col3 un flag booleano usando .gt (maggiore di) per confrontare col2 con zero. Moltiplicando il risultato di uno si convertono i flag booleani in uno e uno zero.

df1 = pd.DataFrame({'col1': [1, 0, 0, 0, 3, 2, 0], 
        'col2': [0, 1, 0, 0, 3, 0, 4]}) 

df1['col3'] = df1.col2.gt(0) * 1 

>>> df1 
Out[70]: 
    col1 col2 col3 
0  1  0  0 
1  0  1  1 
2  0  0  0 
3  0  0  0 
4  3  3  1 
5  2  0  0 
6  0  4  1 

È anche possibile utilizzare un'espressione lambda per ottenere lo stesso risultato, ma credo che il metodo di cui sopra è più semplice per il vostro dato esempio.

df1['col3'] = df1['col2'].apply(lambda x: 1 if x > 0 else 0)