纵向数据集按条件筛选行:仅保留接受CD和EF治疗的患者
问题描述
我有一个纵向数据集,结构如下:
| ID | drug | drug sequence | drug type |
|---|---|---|---|
| A | X | 1 | AB |
| A | X | 1 | AB |
| A | Y | 2 | CD |
| A | Z | 3 | CD |
| A | V | 4 | EF |
| A | V | 4 | EF |
| B | W | 1 | GH |
| B | W | 1 | GH |
| B | W | 2 | GH |
| C | Z | 1 | CD |
| C | V | 2 | EF |
| C | V | 2 | EF |
我需要仅保留只接受过CD和EF类型药物治疗的患者——即患者的所有药物类型只能是CD或EF,且同时包含这两种——排除其他所有患者,最终结果如下:
| ID | drug | drug sequence | drug type |
|---|---|---|---|
| C | Z | 1 | CD |
| C | V | 2 | EF |
| C | V | 2 | EF |
患者A被排除是因为他除了CD和EF外还接受过AB类型治疗;患者B被排除是因为他只接受过GH类型治疗。
我尝试了以下代码,但无法正常工作:
df_group = df.groupby("id").filter(lambda x : (x["drug type"]=="CD").all())
解决方案
你的原有代码问题在于要求患者所有记录的药物类型都是CD,这和需求完全不符。要实现目标,需要同时满足两个核心条件:
- 患者的所有药物类型仅包含CD或EF(无其他类型)
- 患者同时接受过CD和EF两种类型的药物
可以通过groupby.filter结合集合操作实现:
# 定义允许的药物类型集合 allowed_types = {"CD", "EF"} # 筛选符合条件的患者数据 filtered_df = df.groupby("ID").filter(lambda group: # 条件1:该患者所有药物类型都在允许范围内 group["drug type"].isin(allowed_types).all() # 条件2:该患者同时拥有CD和EF两种类型 and set(group["drug type"]) == allowed_types )
代码说明
group["drug type"].isin(allowed_types).all():检查当前患者的所有药物记录是否都属于CD/EF,直接排除像A这种存在其他类型的患者set(group["drug type"]) == allowed_types:确保患者的药物类型集合恰好包含CD和EF,排除像B这种只有单一类型的患者
如果你的DataFrame中ID列是小写id,请把代码里的groupby("ID")改为groupby("id"),和列名保持一致。
内容的提问来源于stack exchange,提问作者Reumapt SPR
相关产品推荐
相关产品推荐

