这是数据框架:
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,汗,WD,CD,CD,MS和FN的可用性。然后,如果疾病值是"高清,汗水或wd",则DF2中的" HD"列将获得1,如果F1中的疾病值是MS或HD,则DF2中的MS列将获得1,如果FN中的疾病在FN中。是1,然后df2中的fn将接收1。因此,df2就是这样:
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
我已经问了一个类似的问题。但是,在这个问题中,没有"或"在列疾病中寻找价值。将数据分组在数据框架中,检查特定值的可用性,并更新第二个数据框架
这可以通过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将replace
和groupby
缩短到一行:
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
谢谢!
另一种方法实现此
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