Определите размер в каждой группе, имеющей то же значение в другом столбце - PullRequest
0 голосов
/ 24 декабря 2018

У меня dataframe вот так,

ID,CLASS_ID,ACTIVE
1,123,0
2,123,0
3,456,1
4,123,0
5,456,1
11,123,1
18,123,0
7,456,0
19,123,0
8,456,1

Я пытаюсь получить кумулятивное число CLASS_ID, имеющее то же значение для ACTIVE.В случае приведенного выше кадра данных, CLASS_ID постоянно имеет ACTIVE как 0, до 4-й записи записи, следующее значение которой равно 1. Таким образом, до 4-й записи число должно быть 3. Этот процесс должен быть продолжени счетчик должен сбрасываться каждый раз, когда значение ACTIVE изменяется для CLASS_ID Ожидаемый результат следующий:

ID,CLASS_ID,ACTIVE,ACTIVE_COUNT
1,123,0,3
2,123,0,3
3,456,1,2
4,123,0,3
5,456,1,2
11,123,1,1
18,123,0,2
7,456,0,1
19,123,0,2
8,456,1,1

Я пытался использовать df.groupby(..).transform(..), но у меня не получилось,Может ли кто-нибудь мне немного помочь?

1 Ответ

0 голосов
/ 24 декабря 2018

Это можно сделать с помощью groupby:

ind = df.groupby('CLASS_ID').ACTIVE.apply(
    lambda x: x.ne(x.shift()).cumsum()
)
df['ACTIVE_COUNT'] = df.groupby(['CLASS_ID', ind]).ACTIVE.transform('count')

df
   ID  CLASS_ID  ACTIVE  ACTIVE_COUNT
0   1       123       0             3
1   2       123       0             3
2   3       456       1             2
3   4       123       0             3
4   5       456       1             2
5  11       123       1             1
6  18       123       0             2
7   7       456       0             1
8  19       123       0             2
9   8       456       1             1

Подробно
Сначала создайте столбец индикатора, отмечающий строки с одинаковым значением для группы:

ind = df.groupby('CLASS_ID').ACTIVE.apply(
    lambda x: x.ne(x.shift()).cumsum()
)
ind

0    1
1    1
2    1
3    1
4    1
5    2
6    3
7    2
8    3
9    3
Name: ACTIVE, dtype: int64

Затем мы используем ind в качестве аргумента группировщика для df.groupby вместе с "CLASS_ID", а затем вычисляем размер каждой группы, используя transform.

df.groupby(['CLASS_ID', ind]).ACTIVE.transform('count')

0    3
1    3
2    2
3    3
4    2
5    1
6    2
7    1
8    2
9    1
Name: ACTIVE, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...