如何为每个具有条件的id分配二进制值

问题描述 投票:1回答:1

我想看看每个成员是否沉迷于某种毒品,沉迷于一种毒品,其他则为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)开始同样,在首次获得资格后,也无法使该药上瘾。但是下次可能会上瘾,也许一年后,他使用了这种药物。

python pandas numpy scikit-learn jupyter-notebook
1个回答
1
投票

查看是否适合您

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()创建一个从零开始更改数字的序列。

然后基本上就是您已经尝试过的。按gid分组,然后对供应计数求和。

© www.soinside.com 2019 - 2024. All rights reserved.