You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

纵向数据集按条件筛选行:仅保留接受CD和EF治疗的患者

问题描述

我有一个纵向数据集,结构如下:

IDdrugdrug sequencedrug type
AX1AB
AX1AB
AY2CD
AZ3CD
AV4EF
AV4EF
BW1GH
BW1GH
BW2GH
CZ1CD
CV2EF
CV2EF

我需要仅保留只接受过CD和EF类型药物治疗的患者——即患者的所有药物类型只能是CD或EF,且同时包含这两种——排除其他所有患者,最终结果如下:

IDdrugdrug sequencedrug type
CZ1CD
CV2EF
CV2EF

患者A被排除是因为他除了CD和EF外还接受过AB类型治疗;患者B被排除是因为他只接受过GH类型治疗。

我尝试了以下代码,但无法正常工作:

df_group = df.groupby("id").filter(lambda x : (x["drug type"]=="CD").all())
解决方案

你的原有代码问题在于要求患者所有记录的药物类型都是CD,这和需求完全不符。要实现目标,需要同时满足两个核心条件:

  1. 患者的所有药物类型仅包含CD或EF(无其他类型)
  2. 患者同时接受过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 02:36:15