оконные функции pandas python
есть данные такого вида:
Сумма для каждого ID без категории указана общая по всему ID, нужно посчитать часть, которая должна получиться после вычета сумм по категориям. На выходе должен получиться такой результат:
таких 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()

