Python 嵌套np.where

Python 嵌套np.where,python,pandas,numpy,Python,Pandas,Numpy,我有以下数据帧: S A 1 1 1 0 2 1 2 0 我想创建一个新的“Result”列,该列根据列a和列S的值进行计算 我编写了以下嵌套的np.where代码 但是当我执行它时,我得到以下错误: SyntaxError: invalid syntax 我的代码有什么问题?据我所知,np.where不支持多个返回语句,至少不支持两个以上。因此,要么重写np.where以得到一个True和一个False语句,并为True/False返回1/0,要么需要使用掩码 如果重写np.where,将

我有以下数据帧:

S A
1 1
1 0
2 1
2 0
我想创建一个新的“Result”列,该列根据列a和列S的值进行计算

我编写了以下嵌套的np.where代码

但是当我执行它时,我得到以下错误:

SyntaxError: invalid syntax
我的代码有什么问题?

据我所知,np.where不支持多个返回语句,至少不支持两个以上。因此,要么重写np.where以得到一个True和一个False语句,并为True/False返回1/0,要么需要使用掩码

如果重写np.where,将限制为两个结果,并且当条件不为真时,将始终设置第二个结果。因此,它也将为S==5&A=np.nan等值设置

使用遮罩时,可以应用任意数量的条件和结果。对于您的示例,解决方案如下所示:

mask_0 = ((df.S == 1) & (df.A == 0)) | ((df.S == 2) & (df.A == 1))
mask_1 = ((df.S == 1) & (df.A == 1)) | ((df.S == 2) & (df.A == 0))
df.loc[mask_0, 'Result'] = 0
df.loc[mask_1, 'Result'] = 1
如果不满足任何条件,结果将设置为np.nan。这是imho故障保护,因此应使用。但是,如果您想在这些位置有零,只需用零初始化结果列。
当然,对于特殊情况,例如只有1和0作为结果,这可以简化,并且可以通过使用DICT或其他容器对任意数量的结果进行扩展。

您应该使用嵌套的np.where。它类似于sql case子句。但是,当数据中存在nan时,请小心

df=pd.DataFrame({'S':[1,1,2,2],'A':[1,0,1,0]})
df['Result'] = np.where((df.S == 1) & (df.A == 1), 1,   #when... then
                 np.where((df.S == 1) & (df.A == 0), 0,  #when... then
                  np.where((df.S == 2) & (df.A == 1), 0,  #when... then
                    1)))                                  #else
df
输出: 如果您有非常嵌套的操作,我建议使用

df=pd.DataFrame{ S:[1,1,2,2], 答:[1,0,1,0] } 当然,您可以将第1、4和2、3条与“|”或运算符组合在一起 df['RESULT']=np.select[ df.S==1和df.A==1, df.S==1和df.A==0, df.S==2和df.A==1, df.S==2&df.A==0 ], [1, 0, 0, 1]
结束括号太多了,谢谢!我删除了额外的右括号,但得到了以下错误:~\Anaconda3\lib\site packages\pandas\core\generic.py,第3614行,在getattr返回对象中。\uuu getattribute\uu self,name。AttributeError:“DataFrame”对象没有属性。使用这种方法是否可以不简单地设置1或0,而是从另一列获取值?尝试时,我得到ValueError:无法从重复轴重新编制索引。当然,我想这应该很容易。但如果没有任何样本数据,就很难给出答案。你可以发布一个新问题,并将链接作为评论发布吗?我会更详细地回答你的新问题。
mask_0 = ((df.S == 1) & (df.A == 0)) | ((df.S == 2) & (df.A == 1))
mask_1 = ((df.S == 1) & (df.A == 1)) | ((df.S == 2) & (df.A == 0))
df.loc[mask_0, 'Result'] = 0
df.loc[mask_1, 'Result'] = 1
df=pd.DataFrame({'S':[1,1,2,2],'A':[1,0,1,0]})
df['Result'] = np.where((df.S == 1) & (df.A == 1), 1,   #when... then
                 np.where((df.S == 1) & (df.A == 0), 0,  #when... then
                  np.where((df.S == 2) & (df.A == 1), 0,  #when... then
                    1)))                                  #else
df
|   | S | A | Result |
|---|---|---|--------|
| 0 | 1 | 1 | 1      |
| 1 | 1 | 0 | 0      |
| 2 | 2 | 1 | 0      |
| 3 | 2 | 0 | 1      |