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

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

ID  X1  X2  Y
 A  11  47  0
 A  11  87  0
 A  56  33  0
 A  92  72  1
 A  83  34  0
 A  34  31  0
 B  88  62  1
 B  28  71  0
 B  95  28  0
 B  92  87  1
 B  91  45  0
 C  46  59  0
 C  60  68  1
 C  67  78  0
 C  26  26  0
 C  13  77  0
 D  40  95  0
 D  25  26  1
 D  93  31  0
 D  71  67  0
 D  91  24  1
 D  80  19  0
 D  44  49  0
 D  41  84  1
 E  38  10  0
 F  23  75  1
 G  46  58  1
 G  44  52  0

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

  • Примечание: его следует применять для каждого ID отдельно.

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

ID  X1  X2  Y  after
 A  11  47  0       0
 A  11  87  0       0
 A  56  33  0       0
 A  92  72  1       0
 A  83  34  0       1
 A  34  31  0       1
 B  88  62  1       0
 B  28  71  0       0
 B  95  28  0       0
 B  92  87  1       0
 B  91  45  0       1
 C  46  59  0       0
 C  60  68  1       0
 C  67  78  0       1
 C  26  26  0       1
 C  13  77  0       1
 D  40  95  0       0
 D  25  26  1       0
 D  93  31  0       0
 D  71  67  0       0
 D  91  24  1       0
 D  80  19  0       0
 D  44  49  0       0
 D  41  84  1       0
 E  38  10  0       0
 F  23  75  1       0
 G  46  58  1       0
 G  44  52  0       1

Это может помочь: Назначить значение 1 до того, как другая переменная станет равной 1, только в первый раз

1 Ответ

1 голос
/ 01 мая 2020

Давайте попробуем idxmax с transform Сначала попробуйте найти индекс последней 1 для каждой группы, затем нам просто нужно сравнить исходный индекс с этим выводом.

df['before']=(df.iloc[::-1,].groupby('ID').Y.transform('idxmax').sort_index()<df.index).astype(int)
df
Out[70]: 
   ID  X1  X2  Y  before
0   A  11  47  0       0
1   A  11  87  0       0
2   A  56  33  0       0
3   A  92  72  1       0
4   A  83  34  0       1
5   A  34  31  0       1
6   B  88  62  1       0
7   B  28  71  0       0
8   B  95  28  0       0
9   B  92  87  1       0
10  B  91  45  0       1
11  C  46  59  0       0
12  C  60  68  1       0
13  C  67  78  0       1
14  C  26  26  0       1
15  C  13  77  0       1
16  D  40  95  0       0
17  D  25  26  1       0
18  D  93  31  0       0
19  D  71  67  0       0
20  D  91  24  1       0
21  D  80  19  0       0
22  D  44  49  0       0
23  D  41  84  1       0
24  E  38  10  0       0
25  F  23  75  1       0
26  G  46  58  1       0
27  G  44  52  0       1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...