Python中的嵌套Case when语句



以下代码在SAS:中创建名为"Flagged"的列

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中复制它,通常我会做一个条件代码,但当方面让我困惑时,嵌套的Case

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

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)

如有任何帮助,我们将不胜感激。

谢谢

我认为您已经非常接近了,您需要从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)

相关内容

  • 没有找到相关文章

最新更新