【发布时间】:2021-12-22 00:54:12
【问题描述】:
与我的查询类似,我正在尝试按特定的允许分组代码进行分组,这次还要在设置类别之前检查其他多个条件。
例如,我有以下数据框:
| MemberID | AdmittingCode | LOS | Episode |
|---|---|---|---|
| 1 | a | 5 | 3 |
| 2 | a | 10 | 6 |
| 1 | b | 2 | 3 |
| 2 | b | 1 | 6 |
现在,我想检查平均值是否是中位数的 2 倍以及最小集数是否小于 5,而不是简单地检查平均值和设置类别。我的意思是:
对于 AdmittingCode a,平均值为 7.5 ( (5 + 10) / 2 )。最初,逻辑是将 MemberID 1 的类别设置为 AdmittingCode 为 a,0 因为它小于7.5 LOS(只有 5 个)和对于 MemberID 2 AdmittingCode 为 a,1 因为它超过7.5 LOS(为 10)使用以下代码:
m = df.groupby('AdmittingCode')['LOS'].transform('mean').lt(df['LOS'])
df['LOSCategory'] = m.astype(int)
但是,现在我想在设置类别列之前再检查 2 个条件。
- 我想检查平均值是否不是中位数的 2 倍
- 我还想检查一下情节计数是否小于 5
如果上述两个条件都满足,我希望将类别设置为 0 或 1(即使只有上述条件 1 满足但其他条件不满足的情况)。
注意:这里的平均值和中位数基于每个 AdmittingCode,因此 a 的平均值与 b 的平均值不同和上一个查询一样。
根据这个逻辑,对于 AdmittingCode a,平均值为 7.5,中位数也是 7.5,对于 MemberID 1 AdmittingCode a with LOS 5 和 Episode 计数 3 ,类别将被设置为 0。这里,平均值不是中位数的 2 倍,而且计数小于 5。
最后观察到如下数据框:
| MemberID | AdmittingCode | LOS | Episode | LOSCategory |
|---|---|---|---|---|
| 1 | a | 5 | 3 | 0 |
| 2 | a | 10 | 6 | 1 |
| 1 | b | 2 | 3 | 0 |
| 2 | b | 1 | 6 | 1 |
【问题讨论】:
-
抱歉,您的情况不清楚:/
-
嘿@mozway 所以基本上我想检查平均值是否是特定录取代码的中位数的 2 倍。例如,对于 AdmittingCode 'a',有 2 个成员,memberID 1 和 memberID 2。这里,LOS 分别是 5 和 10。因此,平均值为 5 + 10 / 2,即 7.5,中位数也是 5 + 10 /2,即 7.5。现在,对于 AdmittingCode 'a',平均值不是中位数的 2 倍。两者都等于 7.5。所以,它满足第一个条件。现在,对于 MemberID 1,Episode 计数为 3,小于 5,因此,当两个条件都满足时,LOSCategory 的标志设置为 0。
-
你有 2 个值,所以平均值总是等于中位数……?所以基本上你的代码似乎减少到“情节大于 5 吗?”
-
对于这个小例子是@mozway,但对于更大的数据框,我也需要检查这个东西。
-
我的建议,简化您的问题(删除文本,直奔主题),更新您的示例以提供涵盖不同场景的更有意义的内容
标签: python pandas dataframe group-by pandas-groupby