Назначьте значение 1, когда другая переменная была равна 1 в последний раз - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть этот фрейм данных:

ID      Date  X1  X2  Y
 A  16-07-19  58  50  0
 A  17-07-19  61  83  1
 A  18-07-19  97  38  0
 A  19-07-19  29  77  0
 A  20-07-19  66  71  1
 A  21-07-19  28  74  0
 B  19-07-19  54  65  1
 B  20-07-19  55  32  1
 B  21-07-19  50  30  0
 B  22-07-19  51  38  0
 B  23-07-19  81  61  0
 C  24-07-19  55  29  0
 C  25-07-19  97  69  1
 C  26-07-19  92  44  1
 C  27-07-19  55  97  0
 C  28-07-19  13  48  1
 D  29-07-19  77  27  1
 D  30-07-19  68  50  1
 D  31-07-19  71  32  1
 D  01-08-19  89  57  1
 D  02-08-19  46  70  0
 D  03-08-19  14  68  1
 D  04-08-19  12  87  1
 D  05-08-19  56  13  0
 E  06-08-19  47  35  1

Я хочу создать переменную, равную 1, когда Y был равен 1 в последний раз (для каждого идентификатора) и 0 в противном случае.

Кроме того, чтобы исключить все строки, которые появляются после того, как последний раз Y был равен 1.

Ожидаемый результат:

ID      Date  X1  X2  Y  Last
 A  16-07-19  58  50  0     0
 A  17-07-19  61  83  1     0
 A  18-07-19  97  38  0     0
 A  19-07-19  29  77  0     0
 A  20-07-19  66  71  1     1
 B  19-07-19  54  65  1     0
 B  20-07-19  55  32  1     1
 C  24-07-19  55  29  0     0
 C  25-07-19  97  69  1     0
 C  26-07-19  92  44  1     0
 C  27-07-19  55  97  0     0
 C  28-07-19  13  48  1     1
 D  29-07-19  77  27  1     0
 D  30-07-19  68  50  1     0
 D  31-07-19  71  32  1     0
 D  01-08-19  89  57  1     0
 D  02-08-19  46  70  0     0
 D  03-08-19  14  68  1     0
 D  04-08-19  12  87  1     1
 E  06-08-19  47  35  1     1

1 Ответ

2 голосов
/ 05 февраля 2020

Сначала удалите все строки после последней 1 в Y со сравнением Y с порядком замены и GroupBy.cumsum, затем получите все строки, не равные 0, и отфильтруйте в boolean indexing, последнее использование numpy.where для нового столбца:

df = df[df['Y'].eq(1).iloc[::-1].groupby(df['ID']).cumsum().ne(0).sort_index()]
df['Last'] = np.where(df['ID'].duplicated(keep='last'), 0, 1)
print (df)
   ID      Date  X1  X2  Y  Last
0   A  16-07-19  58  50  0     0
1   A  17-07-19  61  83  1     0
2   A  18-07-19  97  38  0     0
3   A  19-07-19  29  77  0     0
4   A  20-07-19  66  71  1     1
6   B  19-07-19  54  65  1     0
7   B  20-07-19  55  32  1     1
11  C  24-07-19  55  29  0     0
12  C  25-07-19  97  69  1     0
13  C  26-07-19  92  44  1     0
14  C  27-07-19  55  97  0     0
15  C  28-07-19  13  48  1     1
16  D  29-07-19  77  27  1     0
17  D  30-07-19  68  50  1     0
18  D  31-07-19  71  32  1     0
19  D  01-08-19  89  57  1     0
20  D  02-08-19  46  70  0     0
21  D  03-08-19  14  68  1     0
22  D  04-08-19  12  87  1     1
24  E  06-08-19  47  35  1     1

РЕДАКТИРОВАТЬ:

m = df['Y'].eq(1).iloc[::-1].groupby(df['ID']).cumsum().ne(0).sort_index()
df['Last'] = np.where(m.ne(m.groupby(df['ID']).shift(-1)) & m,1,0)
print (df)
   ID      Date  X1  X2  Y  Last
0   A  16-07-19  58  50  0     0
1   A  17-07-19  61  83  1     0
2   A  18-07-19  97  38  0     0
3   A  19-07-19  29  77  0     0
4   A  20-07-19  66  71  1     1
5   A  21-07-19  28  74  0     0
6   B  19-07-19  54  65  1     0
7   B  20-07-19  55  32  1     1
8   B  21-07-19  50  30  0     0
9   B  22-07-19  51  38  0     0
10  B  23-07-19  81  61  0     0
11  C  24-07-19  55  29  0     0
12  C  25-07-19  97  69  1     0
13  C  26-07-19  92  44  1     0
14  C  27-07-19  55  97  0     0
15  C  28-07-19  13  48  1     1
16  D  29-07-19  77  27  1     0
17  D  30-07-19  68  50  1     0
18  D  31-07-19  71  32  1     0
19  D  01-08-19  89  57  1     0
20  D  02-08-19  46  70  0     0
21  D  03-08-19  14  68  1     0
22  D  04-08-19  12  87  1     1
23  D  05-08-19  56  13  0     0
24  E  06-08-19  47  35  1     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...