【问题标题】:Group by one column and show the availability of specific values from another column按一列分组并显示另一列中特定值的可用性
【发布时间】:2018-03-15 00:11:02
【问题描述】:

我有这个数据框:

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

但我不知道如何将 1 分配给每个 drug_id 的 F2['HD'],如果 'HD' 可用于 df1 中的 drug_id

谢谢。

【问题讨论】:

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


    【解决方案1】:

    选项 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 的改进!

    【讨论】:

    • 备选方案 3 df.set_index('drug_id').illness.str.get_dummies().sum(level=0)[['HD','MS','FN']].ge(1).astype(int)
    • @COLDSPEED,谢谢。我尝试了你写的三种代码,但是它们重新组织了药物 id_column。我的数据列的大小为 805 行,其中包括其他药物名称(Effexor、zoloft、...)。有什么办法可以避免吗?再次感谢。
    • @Mary 如果您正在执行 groupby,那么 df.groupby('drug_id', sort=False) 应该会阻止对键进行排序。
    【解决方案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
    

    【讨论】:

    • 谢谢。有什么办法可以说,例如,如果疾病的值为 HD 或 CD ,那么列 HD (在 df2 中)的值为 1 ?或者如果值为 FN 或 HDED,那么 df2 中 FN 的值为 1?如果您认为它更好,我可以创建一个新问题。谢谢。
    • @Mary 最好创建一个新的,并显示您的预期输出
    猜你喜欢
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    相关资源
    最近更新 更多