python - 如何根据条件为每个 id 分配二进制值

标签 python pandas numpy scikit-learn jupyter-notebook

我想看看每个成员是否对某种药物上瘾,1为上瘾,0为其他。

以下数据是每位成员(member)的处方记录。每个成员(member)在第 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的逻辑:

如果成员(member)在过去 90 天内没有手头药物(根据供应量和天数),则其将变为“幼稚状态”。该成员如果90天不吸毒,就可以回到天真状态。

如果成员(member)在“幼稚状态”后的 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 粒药片<162。但在这种情况下,我的代码给了我 170。

最佳答案

看看这是否适合你

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并对供应量进行求和。

关于python - 如何根据条件为每个 id 分配二进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58368966/

相关文章:

python - 数据文件夹应该如何在 cnn 模型中将输入作为 (x-train, y-train), (x-test, y-test)

python - Django:如何避免不必要的 SQL 语句?

python - 如何创建一个频率为一小时(不包括周末)的 pandas.date_range ?

python - 将稀疏矩阵一分为二

python - 从字符串列表实例化两个 2D numpy 数组

python - py2app/Tkinter应用程序错误: "classic environment is no longer supported"

python - 为什么我从 scipy.optimize.fmin 得到不正确的结果?

python - tensorflow_datasets 版本兼容 tensorflow 1.15

python - 如何从 Pandas 的几列中删除不同的字符串

python - 访问嵌套字典 panda 中的单元格的最佳方式是什么?