Python中的嵌套Case-when语句

2024-09-30 01:36:09 发布

您现在位置:Python中文网/ 问答频道 /正文

以下代码在SAS中创建为名为“标记”的列:

Case When t3.Proportion=. then case when t3.'Standardised proportion'n >t1.SigmaMultiple Then 1 else 0  
End
Else 
Case When t3.Proportion=. and  abs(t3.'Standardised proportion'n) > t1.SigmaMultiple Then 1 Else 0
End
End

我试图在python中复制它,通常我会编写一个条件代码,但是当aspect让我感到困惑时,嵌套的情况会发生

我尝试过但似乎不匹配的代码:

conditions =[
     ((dfSigmamissing['Proportion'] == 0) & (dfSigmamissing['SP'] > dfSigmamissing['SigmaMultiple'])),
       ((dfSigmamissing['Proportion'] == 0) & (dfSigmamissing['SP'] < dfSigmamissing['SigmaMultiple'])),
        ((dfSigmamissing['SP'].abs() > (dfSigmamissing['SigmaMultiple'])))
                ]

choices = [1,0,1]

dfSigmamissing['Flagged'] = np.select(conditions, choices, default=0)

任何帮助都将不胜感激

多谢各位


Tags: 代码abselsespendwhent1t3
1条回答
网友
1楼 · 发布于 2024-09-30 01:36:09

我认为,您已经非常接近了,您需要从conditions列表中删除第二个条件,因为如果第一个条件失败,np.select将返回到那里。否则,前两个条件中的一个(几乎)总是正确的,因为它们(几乎)是互补的。此外,我们需要 dfSigmamissing['Proportion'] == 0最后一个条件也是:

conditions = [
     (dfSigmamissing["Proportion"] == 0) & (dfSigmamissing["SP"] > dfSigmamissing["SigmaMultiple"]),
     (dfSigmamissing["Proportion"] == 0) & (dfSigmamissing["SP"].abs() > dfSigmamissing["SigmaMultiple"])
]

choices = [1, 1]

default = 0

dfSigmamissing["Flagged"] = np.select(conditions, choices, default)

其作用如下:

  • 检查第一个条件是否成立

    如果是,请在相应行中输入1

    如果不是,则转到第二个条件

  • 第二个条件成立吗

    如果是,请在相应行中输入1

    如果不是,则返回默认值,即0

为了避免代码中的重复,我们可以重构一些条件元素:

zero_prop = dfSigmamissing["Proportion"] == 0
sp = dfSigmamissing["SP"]
sigma_mul = dfSigmamissing["SigmaMultiple"]

conditions = [
    zero_prop & (sp > sigma_mul),
    zero_prop & (sp.abs() > sigma_mul)
]

这可能会增加可读性

我们可以更进一步,粘合前两个条件,因为它们都将输出1。这意味着我们现在有2个条件,所以我们可以使用np.where,这是np.select的特例。此外,据我所知,sp > sigma_mul包含在sp.abs() > sigma_mul中,因此我们可以删除前者:

condition = zero_prop & (sp.abs() > sigma_mul)
dfSigmamissing["Flagged"] = np.where(condition, 1, 0)

相关问题 更多 >

    热门问题