У меня есть сгруппированная по времени таблица в 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» — это то, чего я хотел бы достичь в идеале.] Ценим любую помощь и предложения от тех, у кого есть лучшие идеи и предложения по решению этой проблемы :-)
Ваше здоровье,
Над
Давай попробуем:
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
Спасибо. Это сработало! Теперь мне нужно пойти и прочитать документацию, чтобы полностью понять, что именно делает этот код. Ценим вашу любезную помощь! :-)