对数据进行分组并搜索值集

时间:2017-10-03 21:45:23

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

这是数据框:

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,Sweat,WD,CD,MS和FN的可用性。然后,如果疾病值是&#34; HD或Sweat或WD&#34;,则列&#34; HD&#34;在df2中将收到1,如果F1中的疾病值是MS或HDED,那么df2中的MS列将收到1,如果FN中的疾病是1,那么df2中的FN将收到1.所以df2是这样的:< / p>

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

我已经问了一个类似的问题。但是在那个问题上,没有&#34;或&#34;在列疾病中搜索值。 grouping data in a data-frame, checking for availability of specific values, and updating the second data frame

2 个答案:

答案 0 :(得分:2)

这可以通过replace电话完成:

repl_dict = {'Sweat' : 'HD', 'WD': 'HD', 'HDED' : 'MS'}
df.illness = df.illness.replace(repl_dict)

现在,请使用之前答案中的任何选项。

df.set_index('drug_id').illness.str.get_dummies()\
         .sum(level=0).ge(1).astype(int).drop('CD', 1)

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

piRSquared shortened replacegroupby到一行:

df.illness.replace(repl_dict).groupby(df.drug_id)\
         .apply('|'.join).str.get_dummies().drop('CD', 1)

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

谢谢!

答案 1 :(得分:2)

实现此目的的另一种方式

pd.crosstab(df['drug_id'],df['illness']).rename(columns={'Sweat' : 'HD', 'WD': 'HD', 'HDED' : 'MS'}).groupby(lambda x : x,axis=1).sum().gt(0).astype(int).drop('CD',1)
Out[290]: 
           FN  HD  MS
drug_id              
lexapro.1   0   1   1
lexapro.2   0   0   1
lexapro.3   0   1   0
lexapro.4   0   1   0
lexapro.5   1   1   0