DenJJ
DenJJ

Reputation: 414

Python version of R's ifelse statement

I am trying to learn Python after learning R and an simple ifelse statement.

In R I have:

df$X <- if(df$A == "-1"){-df$X}else{df$X}

But I am unsure how to implement it in Python, I have tried:

df['X'][df['A'] <1] = -[df['X']
df['X'][df['A'] >1] = [df['X']

But this leads to errors, would appreciate some help.

Upvotes: 10

Views: 7610

Answers (2)

Tapajit Dey
Tapajit Dey

Reputation: 1396

It is also possible to use list comprehension for doing an equivalent of ifelse of R in Python. Showing an example in Python 3, with l and m as equivalents of df['A'] and df['X']

l = [ 1, 2, -3, -4, -5]
m = [ 10, 20, -30, -40, 50]

k = [ y if x>0 else -y for x,y in list(zip(l,m))]
k
>>> [10, 20, 30, 40, -50]

This removes the dependence on numpy

In addition, it can also be used for filtering out unnecessary values

k2 = [ y  for x,y in list(zip(l,m)) if x>0]
k2
>>>[10, 20]

Upvotes: 1

user2285236
user2285236

Reputation:

The equivalent is np.where:

import numpy as np
np.where(df['A'] < 1, -df['X'], df['X'])

This checks if the values in column A are lower than 1. If so, it returns the corresponding value multiplied by -1 from df['X'], otherwise it returns the corresponding value in df['X'].

That said, your error/warning is probably raised because of chained indexing. Instead of df['X'][df['A'] <1] you should use df.loc[df['A'] <1, 'X']. Then you can do the same with two steps as you have shown in the question.

Upvotes: 20

Related Questions