首页 > 解决方案 > 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

在这里,一名患者在不同的日子里接受了诊断测试。有时他需要进一步评估,有时他不需要。我想将这些患者分成三个不同的组:

  1. 不需要任何进一步评估的患者(只有“否”而不是“是”)。
  2. 直接进行进一步评估的患者(仅“是”)。
  3. 两者都需要的患者——在一种情况下不需要,另一种情况下是。

我正在尝试以下代码,但似乎有更好的方法可以做到这一点。

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)]

任何建议,将不胜感激。

标签: pythonpandasdataframe

解决方案


我们可以做到这一点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))

推荐阅读