Рассчитать соотношение (начальное значение года / конечное значение предыдущего года) в многоиндексном фрейме данных - PullRequest
0 голосов
/ 11 июня 2019

В качестве проверки правдоподобности для годовых отчетов, которые я отправляю, я хочу убедиться, что указанная годовая величина является правильной на основе конечного значения, представленного в предыдущем году.В этом мультииндексном фрейме данных я пытаюсь объяснить мою проблему:

import random
col3=[0,0,0,0,2,4,6,0,0,0,100,200,300,400]
col4=[0,0,0,0,4,6,8,0,0,0,200,900,400, 500]

d = {'Unit': [1, 1, 1, 1, 2, 2, 2, 3, 4, 5, 6, 6, 6, 6], 
 'Year': [2014, 2015, 2016, 2017, 2015, 2016, 2017, 2017, 2014, 2015, 2014, 2015, 2016, 2017], 'col3' : col3, 'col4' : col4 }
df = pd.DataFrame(data=d)
df.groupby(['Unit', 'Year']).sum()

Я хочу создать дополнительный столбец с коэффициентами.Так, например: блок 2 год 2016, столбец 3 / блок 2 год 2015, столбец 4 = 4/4 = 1. Следующим моим шагом будет посмотреть, равны ли отношения 1. Я поместил один пример в этот фрейм данных, где отношение не будет равным единице.,В принципе, это мой интересный случай, и я хочу идентифицировать эту точку данных.

Одна из моих проблем заключается в том, что в моем кадре данных много нулей.

Спасибо за любой вклад!

Джен

1 Ответ

1 голос
/ 11 июня 2019

IIUC, вы можете применить функцию для группы:

new_df = df.groupby(['Unit', 'Year']).sum()

new_df['mask'] = (new_df.groupby(level=0, group_keys=False)
                  .apply(lambda x: x.col3/x.col4.shift())
                 )

Тогда ваш new_df выглядит так:

           col3  col4      mask
Unit Year                      
1    2014     0     0       NaN
     2015     0     0       NaN
     2016     0     0       NaN
     2017     0     0       NaN
2    2015     2     4       NaN
     2016     4     6  1.000000
     2017     6     8  1.000000
3    2017     0     0       NaN
4    2014     0     0       NaN
5    2015     0     0       NaN
6    2014   100   200       NaN
     2015   200   900  1.000000
     2016   300   400  0.333333
     2017   400   500  1.000000

И вы можете fillna или фильтровать те, которые не равны 1, как хотелось бы.

...