Pandas实操:如何处理两列数据并完成患者分组?
嘿,我来帮你优化这个患者分组的逻辑!你的思路方向是对的,但可以用更简洁高效的方式一次性完成分组,不用拆分多个DataFrame来回折腾~
先回顾下你的需求:把患者分成三组——从未需进一步评估(仅'no')、直接接受进一步评估(仅'yes')、两种情况均有(既有'no'也有'yes')。
首先明确你的原始数据集示例:
| date | patient_id | clinical_evaluation | |
|---|---|---|---|
| 0 | 2019-08-26 13:32:43.019162 | 8430 | no |
| 1 | 2019-11-15 17:55:11.364877 | 8430 | no |
| 2 | 2019-10-07 18:23:29.611351 | 14338 | yes |
| 3 | 2019-11-04 20:16:28.610965 | 14338 | no |
| 4 | 2019-12-02 20:56:55.966354 | 14338 | no |
优化方案:用GroupBy一次性完成分组判断
步骤1:统计每个患者的评估类型集合
我们可以用groupby('patient_id')结合agg来获取每个患者所有的clinical_evaluation值的集合,这样就能快速判断属于哪一组:
import pandas as pd # 假设你的数据集是df patient_eval = df.groupby('patient_id')['clinical_evaluation'].agg(set).reset_index() patient_eval.columns = ['patient_id', 'eval_types']
这一步会得到每个患者对应的评估类型集合,比如患者8430的集合是{'no'},患者14338的集合是{'yes', 'no'}。
步骤2:根据集合标记分组
这里提供两种方法,你可以根据习惯选择:
方法一:用np.select(更高效,适合大数据集)
import numpy as np # 定义分组条件和对应标签 conditions = [ patient_eval['eval_types'] == {'yes'}, patient_eval['eval_types'] == {'no'}, patient_eval['eval_types'] == {'yes', 'no'} ] choices = ['直接接受进一步评估', '从未需进一步评估', '两种情况均有'] # 给每个患者分配分组 patient_eval['group'] = np.select(conditions, choices, default='未知')
方法二:用apply(更直观,逻辑清晰)
def get_group(eval_types): if 'yes' in eval_types and 'no' not in eval_types: return '直接接受进一步评估' elif 'no' in eval_types and 'yes' not in eval_types: return '从未需进一步评估' elif 'yes' in eval_types and 'no' in eval_types: return '两种情况均有' else: return '未知' patient_eval['group'] = patient_eval['eval_types'].apply(get_group)
步骤3:查看分组结果
运行后patient_eval会包含每个患者的分组信息,示例结果如下:
| patient_id | eval_types | group |
|---|---|---|
| 8430 | {'no'} | 从未需进一步评估 |
| 14338 | {'yes', 'no'} | 两种情况均有 |
可选:把分组标签合并回原始数据集
如果需要把分组信息加到原始的每条记录里,可以用merge:
df_with_group = df.merge(patient_eval[['patient_id', 'group']], on='patient_id', how='left')
为什么这个方案更优?
- 代码更简洁:不需要拆分多个DataFrame,一次性完成统计和分组
- 效率更高:GroupBy操作比多次筛选+
isin更高效,尤其是数据集较大时 - 可扩展性强:如果后续有更多评估类型(比如'pending'),只需要调整条件判断即可
内容的提问来源于stack exchange,提问作者Roy
相关产品推荐
相关产品推荐

