【问题标题】:Nested Case when statements in PythonPython中的嵌套Case when语句
【发布时间】:2021-06-10 12:34:46
【问题描述】:

以下代码在 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 中复制它,通常我会编写一个条件代码,但是嵌套的 Case when 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)

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 嗨@AndrewK,我不熟悉SAS,但我试图写一个答案和解释。不过,不确定输出是否与 SAS 的输出匹配。你能确认它是否匹配吗?我可能理解错了。

标签: python if-statement conditional-statements case case-when


【解决方案1】:

我认为你非常接近,你需要从conditions 列表中删除第二个条件,因为如果第一个条件失败,np.select 将回到那里。否则,前两个条件之一(几乎)总是 True,因为它们(几乎)是互补的。另外,我们需要 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 &gt; sigma_mul 包含在 sp.abs() &gt; sigma_mul 中,所以我们可以放弃前者:

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

【讨论】:

    猜你喜欢
    • 2016-12-10
    • 2014-07-12
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多