首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套的np.where

嵌套的np.where
EN

Stack Overflow用户
提问于 2019-01-16 20:46:41
回答 3查看 11.4K关注 0票数 3

我有以下数据帧:

代码语言:javascript
复制
S A
1 1
1 0
2 1
2 0

我想创建一个新的'Result'列,它是根据列A和列S的值计算得出的。

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

代码语言:javascript
复制
df['Result'] = np.where((df.S == 1 & df.A == 1), 1,
                        (df.S == 1 & df.A == 0), 0,
                        (df.S == 2 & df.A == 1), 0,
                        (df.S == 2 & df.A == 0), 1))))

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

代码语言:javascript
复制
SyntaxError: invalid syntax

我的代码出了什么问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-16 21:10:50

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

如果重写np.where,则限制为两个结果,当条件不为真时,将始终设置第二个结果。因此它也将被设置为像(S == 5) & (A = np.nan)这样的值。

代码语言:javascript
复制
df['Result'] = np.where(((df.S == 1) & (df.A == 1)) | ((df.S == 2) & (df.A == 0)), 1, 0)

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

代码语言:javascript
复制
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故障保护,因此应该使用。但是,如果您想在这些位置使用零,只需将Results列初始化为零即可。

当然,这可以在特殊情况下简化,比如只有1和0作为结果,并通过使用dicts或其他容器扩展到任意数量的结果。

票数 8
EN

Stack Overflow用户

发布于 2019-10-27 07:06:54

您应该使用嵌套的np.where。它就像sql case子句。但是当数据中有nan时要小心。

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
|   | S | A | Result |
|---|---|---|--------|
| 0 | 1 | 1 | 1      |
| 1 | 1 | 0 | 0      |
| 2 | 2 | 1 | 0      |
| 3 | 2 | 0 | 1      |
票数 8
EN

Stack Overflow用户

发布于 2020-10-31 23:36:57

如果你有非常嵌套的操作,我推荐使用numpy.select

代码语言:javascript
复制
df = pd.DataFrame({
    "S": [1, 1, 2, 2],
    "A": [1, 0, 1, 0]
})

# you could of course combine the clause (1, 4) and (2, 3) with the '|' or operator
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])
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54217397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档