оконные функции pandas python

есть данные такого вида:

таблица1

Сумма для каждого ID без категории указана общая по всему ID, нужно посчитать часть, которая должна получиться после вычета сумм по категориям. На выходе должен получиться такой результат:

таблица2

таких ID очень много, я так понимаю, нужен аналог оконной функции на языке python. помогите, пожалуйста.


Ответы (1 шт):

Автор решения: Alexey Trukhanov

Похоже, что вопрос выглядит так: надо взять данные из строки, в которых отсутствуют категории и вычесть из нее сумму сумм из строк, в которых категории указаны. Я так думаю.

import pandas as pd

# делаем датафрейм
col1 = [111, 111, 111, 222, 222, 222]
col2 = [float('nan'), 'xxx', 'xxx', float('nan'), 'yyy', 'yyy']
col3 = [float('nan'), 'aaa', 'bbb', float('nan'), 'ccc', 'ddd']
col4 = [1000, 200, 600, 3000, 400, 800]

column = ['ID', 'Category', 'Sub category', 'SUM']
df = pd.DataFrame(list(zip(col1, col2, col3, col4)), 
                  columns=column).set_index('ID')

# вычитаем 
df.loc[df.Category.isna(), ['SUM']] = \
    df[df.Category.isna()].SUM - \
    df[~df.Category.isna()].groupby('ID').sum().SUM

print(df)

UPD

Добавлю оптимизированный вариант кода от Алексея P, за что ему специальная благодарность:

# вычитаем
df.loc[(m := df.Category.isna()), 'SUM'] -= df[~m].groupby('ID').SUM.sum()
→ Ссылка