如何为每个带有条件的 id 分配二进制值
Posted
技术标签:
【中文标题】如何为每个带有条件的 id 分配二进制值【英文标题】:How to assign binary value for each id with conditions 【发布时间】:2020-02-10 14:48:54 【问题描述】:我想看看每个成员是否对某种药物上瘾,1表示上瘾,0表示其他。
以下数据是每位会员的处方记录。每个成员在第 0 天都有此药的处方记录。supply 是按此药计数提供的天数。
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 的所有供应数量加起来。它应该只根据每个幼稚状态 (z) 加起来 3 个月的供应量(180 天)。例如,id 3 的 y 应该为 0,因为在幼稚状态 2(z=1) 后的 3 个月内,他只服用了 120 颗药丸
【问题讨论】:
不理解赋值1&0的逻辑 我修改了数据并添加了说明。 我还是没完全理解你的问题。但是看看我放在这里的这个问题-->***.com/questions/58388726/… 看看这是否让你知道如何解决你的问题 【参考方案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()
创建一个序列,从每个零开始更改数字。
然后基本上你已经尝试过。按g
和id
分组并对供应计数求和。
【讨论】:
以上是关于如何为每个带有条件的 id 分配二进制值的主要内容,如果未能解决你的问题,请参考以下文章