Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

pandas: Use if-else to populate new column

I have a DataFrame like this:

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

I'd like to add a column that is a 1 if col2 is > 0 or 0 otherwise. If I was using R I'd do something like

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

How would I do this in python / pandas?

like image 835
screechOwl Avatar asked Mar 19 '15 19:03

screechOwl


2 Answers

You could convert the boolean series df.col2 > 0 to an integer series (True becomes 1 and False becomes 0):

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

(To create a new column, you simply need to name it and assign it to a Series, array or list of the same length as your DataFrame.)

This produces col3 as:

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

Another way to create the column could be to use np.where, which lets you specify a value for either of the true or false values and is perhaps closer to the syntax of the R function ifelse. For example:

>>> np.where(df['col2'] > 0, 4, -1)
array([-1,  4, -1, -1,  4, -1,  4])
like image 147
Alex Riley Avatar answered Oct 22 '22 11:10

Alex Riley


I assume that you're using Pandas (because of the 'df' notation). If so, you can assign col3 a boolean flag by using .gt (greater than) to compare col2 against zero. Multiplying the result by one will convert the boolean flags into ones and zeros.

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

You can also use a lambda expression to achieve the same result, but I believe the method above is simpler for your given example.

df1['col3'] = df1['col2'].apply(lambda x: 1 if x > 0 else 0)
like image 30
Alexander Avatar answered Oct 22 '22 12:10

Alexander