Группировка на основе переменного поля, а затем сброс счетчика (cumcount) в python - PullRequest
1 голос
/ 10 июля 2019

Я создаю фрейм данных

df = pd.DataFrame({"b": ['A','A','A','A','B', 'B','B','C','C','D','D', 'D','D','D','D','D','D','D','D','D'],"a": [-3,-4,2, -1, -3, -1,-7,-6, 1, 1, -1, 1,4,5,-3,2,3,4, -1, -2]})

проверка на отрицательные значения

df['val'] = df.a < 0

Добавить столбец накопленной суммы подсчета, в котором счетчик увеличивается, если предыдущие значения не являются отрицательными. (это означает, что для каждого отрицательного значения счетчик увеличивается на 1, но если существует несколько значений -ve, предполагается, что они являются единичным отрицательным значением, а счетчик все еще увеличивается на 1)

df['val_1'] = (((df['val']) & (df['val'] != df['val'].shift())).cumsum()). the table is as below

    b  a    val  val_1
0   A -3   True      1
1   A -4   True      1
2   A  2  False      1
3   A -1   True      2
4   B -3   True      2
5   B -1   True      2
6   B -7   True      2
7   C -6   True      2
8   C  1  False      2
...

Я хочу возобновить подсчет нового значения в поле «b». Счетчик должен начинаться со значения «B». Любые вклады в этом отношении будут полезны

1 Ответ

2 голосов
/ 10 июля 2019

Вы можете сделать это с помощью groupby-transform:

df['val_2'] = df.groupby('b')['val'].transform(lambda x: ((x) & (x != x.shift())).cumsum())

Выход:

    b   a   val     val_1
0   A   -3  True    1
1   A   -4  True    1
2   A   2   False   1
3   A   -1  True    2
4   B   -3  True    1
5   B   -1  True    1
6   B   -7  True    1
7   C   -6  True    1
8   C   1   False   1
9   D   1   False   0
10  D   -1  True    1
11  D   1   False   1
12  D   4   False   1
13  D   5   False   1
14  D   -3  True    2
15  D   2   False   2
16  D   3   False   2
17  D   4   False   2
18  D   -1  True    3
19  D   -2  True    3

Обратите внимание, что первое значение считается как 1, если оно истинно, что может быть не тем, что вы хотите - но оно взято из предоставленного вами кода.

...