我想看看每个成员是否沉迷于某种毒品,沉迷于一种毒品,其他则为0。
以下数据是每个成员的处方记录。每个成员在第0天都有该药物的处方记录。供应量是该药物基于天数的计数。
id supply days
1 30 -200
1 30 0
1 100 183
1 80 250
2 5 0
2 5 10
3 90 0
3 90 94
3 90 253
3 90 343
对于分配1或0的逻辑:
首先是确定合格的声明。
如果会员在过去90天内根据供应和天数未备有毒品,则成为“合格声明”。
并且如果一名成员在获得资格要求后180天内服用了162粒以上的这种药,他将极有可能上瘾。因此我们为此成员分配了值1。
例如,在第0天,成员1,在过去90天内手头没有毒品。他上一次服药是200天前。因此,该记录是合格的声明。但是在第0天后的180天里,他手头上的手数不超过162个。
[第183天,成员1的另一项合格索赔,但是在开始90天之前没有手头的药物,但是,他在183天后的180天内消耗了超过162粒药物。因此,应将他视为上瘾并分配给1为了他。
期望结果应该是
id y
1 1
2 0
3 1
我尝试过的是
df2=df.loc[(0<df.days)&(df.days<=180)]
df2 = df.groupby('id')['supply'].sum().reset_index()
df2['y'] = np.where((df2.supply>=162) , 1, 0)
显然无法正常工作。
挑战是总和的计算应从每个合格的索赔(即天数= 0)开始同样,在首次获得资格后,也无法使该药上瘾。但是下次可能会上瘾,也许一年后,他使用了这种药物。
查看是否适合您
df_d=df.loc[(0<=df.days)&(df.days<=180)]
g=df_d.days.eq(0).cumsum()
df_new = df_d.groupby([g,'id'])['supply'].sum().reset_index().drop('days',axis=1)
df_new['y'] = np.where((df_new.supply>=162) , 1, 0)
print(df_new)
输出
id supply y
0 1 97 0
1 2 10 0
2 3 180 1
详细信息
使用df_d=df.loc[(0<=df.days)&(df.days<=180)]
,我们将创建一个新的df,其日期介于0和180之间。
然后用g=df_d.days.eq(0).cumsum()
创建一个从零开始更改数字的序列。
然后基本上就是您已经尝试过的。按g
和id
分组,然后对供应计数求和。