python - Python中的嵌套Case when语句
问题描述
以下代码在 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)
任何帮助将不胜感激。
谢谢
解决方案
我认为您非常接近,您需要从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
。据我所知,Furhtersp > sigma_mul
包含在 中sp.abs() > sigma_mul
,因此我们可以删除前者:
condition = zero_prop & (sp.abs() > sigma_mul)
dfSigmamissing["Flagged"] = np.where(condition, 1, 0)
推荐阅读
- functional-programming - 为什么 ocaml 有可变数组?
- python - sklearn:使用 Pipeline 和 TransformedTargetRegressor 缩放 x(数据)和 y(目标)
- reactjs - 谷歌分析会话管理在不同选项卡中的同一应用程序,在一个反应应用程序中
- asp.net-core - Linux Ubuntu 上生产中的 Microsoft.Extensions.Logging.Log4Net 问题
- javascript - 如何在平面列表中仅渲染一次特定元素 - React Native
- java - 从 jmeter 中的 JSON 请求有效负载生成 HMAC sha256
- java - 基于元素的最长公共前缀
- javascript - React Native 将 ref 传递给用 HOC 包装的功能组件
- javascript - 使用 Webgl 创建三角形的随机位置
- xml - 使用 XSD 验证一个元素或其他元素或两者