У меня есть группа учетных записей разных типов с различными параметрами, и я пытаюсь рассчитать экономию каждого пользователя за каждый месяц в 2016 году по сравнению с их средним количеством, используемым в 2014 и 2015. Мой DataFrame выглядит следующим образом:Значения суммы Python DataFrame в столбце A на основе условий в столбцахN
key amount id month opt type year
0 100 5 1 M E 2014
1 200 5 1 M G 2014
2 300 5 1 R E 2014
3 400 5 1 R G 2014
4 105 5 1 M E 2015
5 205 5 1 M G 2015
6 305 5 1 R G 2015
7 405 5 1 R E 2015
8 90 5 1 M E 2016
9 180 5 1 M G 2016
10 310 5 1 R G 2016
11 350 5 1 R E 2016
Исходя из вышеизложенного, я бы ожидать, что пользователь «5» сэкономил 12,5 в месяц 1 2016 для «типа» «E» с опцией ' M 'по сравнению со средним значением «amt» 102,5 в 2015 и 2016 годах.
Полный ответ, который я ожидал бы для разных типов в 1-м месяце 2016 года, выглядит следующим образом:
M|E -12.5
M|G -22.5
R|E -2.5
R|G -42.5
Я думал, что функция GroupBy() может работать для этого, но формула я разработал не дает мне правильные ответы.
df_savings = df.groupby(['id','year','month','type','opt'], group_keys=False).apply(
lambda s: float(s['amount'][s.year < 2016].sum()/float(2)) - float(s['amount'][s.year == 2016].sum()))
Любая помощь была бы принята с благодарностью. Вот код, который используется для ФР образца выше:
df = pd.DataFrame({'id':[5,5,5,5,5,5,5,5,5,5,5,5],
'type':['E','G','E','G','E','G','G','E','E','G','G','E'],
'opt':['M','M','R','R','M','M','R','R','M','M','R','R'],
'year':[2014,2014,2014,2014,2015,2015,2015,2015,2016,2016,2016,2016],
'month':[1,1,1,1,1,1,1,1,1,1,1,1],
'amount':[100,200,300,400,105,205,305,405,90,180,310,350]
})
Отлично работает, спасибо @ al0 – christofern