Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to write a lambda function that is conditional on two variables (columns) in python

I have a data set, df, with two variables, x and y. I want to write a function that does the following:

x if x>100 and y<50 else y

I am used to doing data analysis in STATA so I'm relatively new to pandas for data analysis. If it helps, in stata it would look like:

replace x = cond(x>100 & y<50, x, y)

In other words, the function is conditional on two columns in df and will return a value from one variable or the other in each row depending on whether the condition is met.

So far I have been creating new variables through new functions like:

df.dummyVar = df.x.apply(lambda x: 1 if x>100 else 0)

Using StackOverflow and the documentation I have only been able to find how to apply a function dependent on a single variable to more than one column (using the axis option). Please help.

like image 619
seeiespi Avatar asked Jul 16 '14 21:07

seeiespi


3 Answers

Use where:

df['dummyVar '] = df['x'].where((df['x'] > 100) & (df['y'] < 50), df['y'])

This will be much faster than performing an apply operation as it is vectorised.

like image 188
EdChum Avatar answered Nov 09 '22 08:11

EdChum


Like this:

f = lambda x, y: x if x>100 and y<50 else y

Lambda(s) in Python are equivalent to a normal function definition.

def f(x, y):
    return x if x>100 and y<50 else y

NB: The body of a Lambda must be a valid expression. This means you cannot use things like: return for example; a Lambda will return the last expression evaluated.

For some good reading see:

  • Defining Functions
  • Lambdas
like image 21
James Mills Avatar answered Nov 09 '22 08:11

James Mills


There's now an pretty easy way to do this. Just use apply on the dataset:

df['dummy'] = df.apply(lambda row: row['x'] if row['x'] > 100 and row['y'] < 50 else row['y'])
like image 20
seeiespi Avatar answered Nov 09 '22 09:11

seeiespi