如何根据条件为每个ID分配二进制值

2024-05-19 02:14:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想看看每个成员是否对某种毒品上瘾,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   5    0
3   30   100
3   30   150
3   30   200
3   30   280
3   50   310

对于赋值1或0的逻辑:

如果一个会员国在过去的90天内没有毒品,根据供应和天数,它将成为“幼稚状态”。如果在90天内不吸毒,这个成员可能会回到天真的状态。你知道吗

如果一个会员在“幼稚状态”后的3个月内手头上有超过162天的药物供应,他将有很高的成瘾风险。所以我们给这个成员赋值1。你知道吗

结果应该是

id      y
1       1
2       0
3       0

我试过的是

#Create Z,Z is the number of each naive status.
z=[]
y=0
z.append(y)
for i in range(len(abc)-1):
 if ((df.days[i+1]-df.days[i])>90)&((df.id[i+1]-df.id[i])==0):
  y=y+1
  z.append(y)
 else:
    if (df.id[i+1]-df.id[i])!=0: 
     y=0
     z.append(y)
    else:
     if (df.id[i+1]-df.id[i])==0:
      y=y
      z.append(y)
df['z']=z
#groupby id and z . sum.
df2=df.groupby(['id','z']).sum()
#create y to assign value.
df2['y'] = np.where((df2.supply>=162) , 1, 0)

我的结果是

id  supply  days   z
1   30     -200    0
1   30      0      1
1   100     183    2
1   80      250    2
2   5       0      0
2   5       10     0
3   30      0      0
3   30      100    1
3   30      150    1
3   30      200    1
3   30      280    1
3   30      310    1

       supply_sum
id  z
-------------   
1   0   30
    1   30
    2   180
-----------
2   0   10
-----------
3   0   30
    1   170


    id z     y
-------------------
    1  0     
       1
       2     1
-----------------
    2  0     0
------------------
    3  0     
       1     1

不起作用,因为我把每个z的供应量加起来。它应该只加上3个月的供应量(180天)基于每个天真的状态(z)。例如,id 3的y应该是0,因为在天真状态2(z=1)之后的3个月内,他只吃了120片<;162。但我的密码是170。你知道吗


Tags: iddfif状态成员代表dayssum
1条回答
网友
1楼 · 发布于 2024-05-19 02:14:21

看看这对你有用吗

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)]我们创建一个天在0&180之间的新df。你知道吗

然后用g=df_d.days.eq(0).cumsum()我们创建一个系列,从每个零开始改变数字。你知道吗

基本上你已经试过了。按g&;id分组,并对供应计数求和。你知道吗

相关问题 更多 >

    热门问题