Панда бегущая сумма - PullRequest
       12

Панда бегущая сумма

0 голосов
/ 24 сентября 2019

У меня есть датафрейм для панд, и он выглядит примерно так:

 x y
 1 0
 2 1
 3 2
 4 0 <<<< Reset
 5 1
 6 2
 7 3
 8 0 <<<< Reset
 9 1
10 2

Значения x могут быть любыми, они не имеют значения для этого вопроса.Значение y увеличивается, сбрасывается и снова увеличивается.Мне нужен третий столбец (z), который представляет собой число, представляющее группы, поэтому он увеличивается при сбросе значений y.

Я не могу гарантировать, что сброс будет равен нулю, только значение, которое меньшечем предыдущий, должен указывать сброс.

 x y z
 1 0 0
 2 1 0
 3 2 0
 4 0 1 <<<< Incremented by 1
 5 1 1
 6 2 1
 7 3 1
 8 0 2 <<<< Incremented by 1
 9 1 2
10 2 2

Так что для получения z я понимаю, что нужно сделать, просто не знаком с синтаксисом.Мое решение состоит в том, чтобы сначала присвоить z в качестве разреженного столбца из 0 и 1, где все равно нулю, кроме 1, когда y[ix] < y[ix-1] указывает на то, что счетчик y был сброшен.Затем к столбцу z должна быть добавлена ​​кумулятивная промежуточная сумма, означающая, что: z[ix] = sum(z[0],z[1],...,z[ix])

Буду признателен за некоторую помощь с синтаксисом назначения столбца z, если у кого-то есть момент.

Ответы [ 2 ]

2 голосов
/ 24 сентября 2019

Использование ne(1)

df.y.diff().ne(1).cumsum().sub(1)

0    0
1    0
2    0
3    1
4    1
5    1
6    1
7    2
8    2
9    2
Name: y, dtype: int32
2 голосов
/ 24 сентября 2019

Исходя из вашей логики:

#general case
df['z'] = df['y'].diff().lt(0).cumsum()

# or equivalently
# df['z'] = df['y'].lt(df['y'].shift()).cumsum()

Вывод:

    x  y  z
0   1  0  0
1   2  1  0
2   3  2  0
3   4  0  1
4   5  1  1
5   6  2  1
6   7  3  1
7   8  0  2
8   9  1  2
9  10  2  2
...