基于Pandas按AdmittingCode分组并多条件判断创建LOSCategory分类列
Pandas: 基于分组统计量与多条件生成分类列
我来帮你搞定这个Pandas的分组条件判断问题!根据你的需求,我们需要基于两个同时成立的分组级条件来生成LOSCategory列,下面一步步来实现:
1. 先创建示例数据
首先我们还原你给出的示例DataFrame:
import pandas as pd df = pd.DataFrame({ 'MemberID': [1, 2, 1, 2], 'AdmittingCode': ['a', 'a', 'b', 'b'], 'LOS': [5, 10, 2, 1], 'Episode': [3, 6, 3, 6] })
2. 实现多条件分组判断逻辑
核心思路是先计算每个AdmittingCode分组的LOS均值和中位数,再结合Episode的条件进行判断:
# 按AdmittingCode分组,计算每组LOS的均值和中位数,并映射到原DataFrame的每一行 grouped_los = df.groupby('AdmittingCode')['LOS'] los_mean = grouped_los.transform('mean') los_median = grouped_los.transform('median') # 定义两个需要同时满足的条件 condition1 = los_mean != 2 * los_median # 分组均值≠中位数的2倍 condition2 = df['Episode'] < 5 # 当前行Episode小于5 # 生成LOSCategory:两个条件同时满足则为0,否则为1 df['LOSCategory'] = (~(condition1 & condition2)).astype(int)
3. 逻辑解释
transform方法的作用是把分组计算的统计量(均值、中位数)广播到原DataFrame的每一行,保证我们能逐行和分组级的数值做比较。- 我们用
&表示两个条件同时成立,再通过~取反,最后转成整数类型(True对应1,False对应0),正好符合你要求的分类规则。
如果你觉得取反的逻辑有点绕,也可以用np.where写得更直观:
import numpy as np df['LOSCategory'] = np.where(condition1 & condition2, 0, 1)
这个写法直接指定:当两个条件同时满足时赋值0,否则赋值1,结果和上面完全一致。
最终结果
运行代码后,你会得到预期的DataFrame:
| 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 |
内容的提问来源于stack exchange,提问作者WollyMc
相关产品推荐
相关产品推荐

