按一列分组并显示另一列中特定值的可用性
Group by one column and show the availability of specific values from another column
我有这个数据框:
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')
但我不知道如何为每个 drug_id 将 1 分配给 F2['HD']
,如果 'HD'
可用于 [=16] 中的 drug_id
=].
谢谢。
选项 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 的改进!
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
我有这个数据框:
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')
但我不知道如何为每个 drug_id 将 1 分配给 F2['HD']
,如果 'HD'
可用于 [=16] 中的 drug_id
=].
谢谢。
选项 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 的改进!
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