2017-10-03 4 views
0

Je cette dataframe:groupe par une colonne et afficher la disponibilité des valeurs spécifiques d'une autre colonne

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 

Je vais d'abord regrouper les données basées sur drug_id, et la recherche de disponibilité de HD, MS, et FN dans la colonne maladie. Puis remplissez la deuxième trame de données comme ceci:

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 

Ceci est mon code pour le regroupement.

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

mais je ne sais pas comment je peux attribuer 1 à la F2['HD'] pour chaque drug_id, si le 'HD' était disponible pour cette drug_id dans df1.

Merci.

Répondre

2

Option 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 

Option 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 

Option 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 

Merci à Scott Boston pour l'amélioration!

+1

alternative à l'option 3 'df.set_index ('drug_id'). Illness.str.get_dummies somme(). (Niveau = 0) [[ 'HD', 'MS', 'FN']]. ge (1) .astype (int) ' –

+0

@COLDSPEED, merci. J'ai essayé les trois types de codes que vous avez écrits, mais ils réorganisent la drogue id_column. La taille de ma colonne de données est de 805 lignes et elle inclut d'autres noms de médicaments (Effexor, zoloft, ...). Y a-t-il un moyen de l'éviter? Merci encore. – Mary

+0

@Mary aussi, fermons cette question, marquons cette réponse comme acceptée ~ – Wen

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 
+0

merci. Existe-t-il un moyen de dire, par exemple, si la valeur de la maladie était HD ou CD, alors la valeur de la colonne HD (en df2) est 1? ou si la valeur est FN ou HDED, alors la valeur de FN dans le df2 est 1? Je peux créer une nouvelle question, si vous pensez que c'est mieux. Merci. – Mary

+0

@Mary il est préférable de créer un nouveau, et montrer votre sortie attendue – Wen

+0

OK, merci. Je crée une nouvelle question – Mary