2017-02-03 11 views
3

У меня есть группа учетных записей разных типов с различными параметрами, и я пытаюсь рассчитать экономию каждого пользователя за каждый месяц в 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] 
      }) 

ответ

1

Вы можете разделить его на две части, 2016 и 2014-15, а затем GroupBy что приводит к двух одинаковых dataframes вы можете вычесть:

df[df.year == 2016].groupby(['id', 'month', 'opt', 'type'])['amount'].sum() - df[df.year < 2016].groupby(['id', 'month', 'opt', 'type'])['amount'].mean() 
+0

Отлично работает, спасибо @ al0 – christofern

 Смежные вопросы

  • Нет связанных вопросов^_^