Cumsum на Pandas DF со сбросом на ноль для отрицательных кумулятивных значений

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

Я использовал cumsum() с функциями groupby(), но не могу сбросить кумулятивные значения до нуля на лету. Я также просмотрел ветку ниже, но это связано с немного другой проблемой:

Датафрейм Pandas - текущая сумма со сбросом

Ниже приведен код (с примерами данных, с которыми я работал):

group = ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C']
values = [-5, 4, 2, -4, -2, -2, 5, -2, 3, 6, 7, -11]
df = pd.DataFrame(list(zip(group, values)), columns =['group', 'val'])
df['cumsum_output'] = df.groupby('group')['val'].cumsum()
df['expected_out'] = [0, 4, 6, 2, 0, 0, 5, 3, 3, 9, 16, 5]

    group   val    cumsum_output    expected_out
0   A        -5               -5               0
1   A         4               -1               4
2   A         2                1               6
3   A        -4               -3               2
4   A        -2               -5               0
5   B        -2               -2               0
6   B         5                3               5
7   B        -2                1               3
8   C         3                3               3
9   C         6                9               9
10  C         7               16              16
11  C       -11                5               5

['cumsum_output' - это то, что я получаю из моего текущего кода; и «expected_out» — это то, чего я хотел бы достичь в идеале.] Ценим любую помощь и предложения от тех, у кого есть лучшие идеи и предложения по решению этой проблемы :-)

Ваше здоровье,

Над

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
1 255
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Давай попробуем:

neg = df['val'] < 0
df['output'] = df['val'].groupby([neg[::-1].cumsum(),df['group']]).cumsum().clip(0)

Выход:

   group  val  cumsum_output  expected_out  output
0      A   -5             -5             0       0
1      A    4             -1             4       4
2      A    2              1             6       6
3      A   -4             -3             2       2
4      A   -2             -5             0       0
5      B   -2             -2             0       0
6      B    5              3             5       5
7      B   -2              1             3       3
8      C    3              3             3       3
9      C    6              9             9       9
10     C    7             16            16      16
11     C  -11              5             5       5

Спасибо. Это сработало! Теперь мне нужно пойти и прочитать документацию, чтобы полностью понять, что именно делает этот код. Ценим вашу любезную помощь! :-)

Nadeer Khan 10.12.2020 02:37

Другие вопросы по теме