按一列分组,显示另一列中特定值的可用性

时间:2017-10-03 17:57:56

标签: python pandas dataframe group-by pandas-groupby

我有这个数据框:

df1:

  drug_id      illness 
    lexapro.1     HD
    lexapro.1     MS
    lexapro.2     HDED
    lexapro.2     MS
    lexapro.2     MS
    lexapro.3     CD
    lexapro.3     Sweat
    lexapro.4     HD
    lexapro.5     WD
    lexapro.5     FN

我将首先根据drug_id对数据进行分组,并在疾病列中搜索HD,MS和FN的可用性。然后填写第二个数据框,如下所示:

df2:
drug_id       HD      MS    FN
lexapro.1      1      1      0
lexapro.2      0      1      0   
lexapro.3      0      0      0
lexapro.4      1      0      0
lexapro.5      0      0      1

这是我的分组代码。

df1.groupby('drug_id', sort=False).isin('HD')

但我不知道如果F2['HD']可用于'HD' drug_id,我可以为每个drug_id分配1 df1

谢谢。

2 个答案:

答案 0 :(得分:2)

选项1
crosstab

pd.crosstab(df.drug_id, df.illness)[['HD', 'MS', 'FN']].ge(1).astype(int)

illness    HD  MS  FN
drug_id              
lexapro.1   1   1   0
lexapro.2   0   1   0
lexapro.3   0   0   0
lexapro.4   1   0   0
lexapro.5   0   0   1

选项2
groupby + value_counts + unstack

df.groupby('drug_id').illness.value_counts()\
     .unstack()[['HD', 'MS', 'FN']].ge(1).astype(int)

illness    HD  MS  FN
drug_id              
lexapro.1   1   1   0
lexapro.2   0   1   0
lexapro.3   0   0   0
lexapro.4   1   0   0
lexapro.5   0   0   1

选项3
get_dummies + sum

df.set_index('drug_id').illness.str.get_dummies()\
          .sum(level=0)[['HD', 'MS', 'FN']].ge(1).astype(int)

           HD  MS  FN
drug_id              
lexapro.1   1   1   0
lexapro.2   0   1   0
lexapro.3   0   0   0
lexapro.4   1   0   0
lexapro.5   0   0   1

感谢Scott Boston的改进!

答案 1 :(得分:2)

df.groupby(['drug_id','illness']).illness.count().unstack(-1).reindex_axis(['HD', 'MS', 'FN'],axis=1).ge(0).astype(int)
Out[276]: 
illness    HD  MS  FN
drug_id              
lexapro.1   1   1   0
lexapro.2   0   1   0
lexapro.3   0   0   0
lexapro.4   1   0   0
lexapro.5   0   0   1