python - Pandas:如何操作不同组中的两列和分段?
问题描述
我有一个患者及其诊断的数据集:
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
在这里,一名患者在不同的日子里接受了诊断测试。有时他需要进一步评估,有时他不需要。我想将这些患者分成三个不同的组:
- 不需要任何进一步评估的患者(只有“否”而不是“是”)。
- 直接进行进一步评估的患者(仅“是”)。
- 两者都需要的患者——在一种情况下不需要,另一种情况下是。
我正在尝试以下代码,但似乎有更好的方法可以做到这一点。
df_yes = df[df['clinical_evaluation'] == 'yes']
df_no = df[df['clinical_evaluation'] == 'no']
df_yes.loc[df_yes.patient_id.isin(df_no.patient_id)]
任何建议,将不胜感激。
解决方案
我们可以做到这一点crosstab
,使用这个新的输出作为条件矩阵
Ptype=pd.crosstab(df['patient_id'], df['clinical_evaluation'])
df_yes = df[df['patient_id'].isin(Ptype.index[Ptype['yes'].ne(0) & Ptype['no'].eq(0)])]
df_no = df[df['patient_id'].isin(Ptype.index[Ptype['yes'].eq(0) & Ptype['no'].ne(0)])]
df_both = df[df['patient_id'].isin(Ptype.index[Ptype['yes'].ne(0) & Ptype['no'].ne(0)])]
如果我们想将它们分成不同的标签,类型有三个类别noyes, no , yes
df['type']=df['patient_id'].map(Ptype.ne(0).dot(Ptype.columns))