Как назначить двоичное значение для каждого идентификатора с условиями - PullRequest
1 голос
/ 14 октября 2019

Я хочу посмотреть, зависим ли каждый участник от того или иного вида наркотиков, 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 дней.

И если у участника есть более 162 дней лекарств, поставленных под рукой, в течение 3 месяцев после «наивного статуса», он будет находиться на очень высоком уровне. риск привыкания. поэтому для этого члена мы присваиваем значение 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 должно быть 0, потому что через 3 месяца после наивного статуса 2 (z = 1) он принял только 120 таблеток <162. Но мой код дал мне 170 в этом случае. </p>

1 Ответ

2 голосов
/ 14 октября 2019

Проверьте, работает ли это для вас

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 и суммируйте количество поставок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...