Python版本的R的ifelse语句

9

学习了R和简单的ifelse语句后,我正在尝试学习Python。

在R中,我有:

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

但是我不确定如何在Python中实现它,我尝试过:

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

但是这样会导致错误,希望能得到一些帮助。

3
一个提示,Python 通常不是矢量化的,因此,如果您在 R 代码中使用某种形式的矢量化,请查看 numpy/pandas,以获取类似的 Python 功能。 - juanpa.arrivillaga
1
感谢 juanpa.arrivillage。 - DenJJ
2个回答

19

相应的函数是np.where

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

这段代码检查列A中的值是否小于1,如果是,则返回从df['X']中对应的值乘以-1的结果,否则返回df['X']中对应的值。

另外,你遇到的错误/警告可能是由于链式索引造成的。你应该使用df.loc[df['A'] <1, 'X']而不是df['X'][df['A'] <1]。然后你可以像你在问题中展示的那样用两个步骤完成相同的操作。


1

在Python中,也可以使用列表推导式来实现R语言中的ifelse等价操作。以下是一个Python 3的示例,其中lm相当于df['A']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]

这将消除对 numpy 的依赖。
此外,它还可用于过滤掉不必要的值。
k2 = [ y  for x,y in list(zip(l,m)) if x>0]
k2
>>>[10, 20]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接