在多指标数据框中计算比率(年份的起始值/上一年的终止值)

时间:2019-06-11 12:54:44

标签: python pandas dataframe multi-index

作为对发送的年度报告的合理性检查,我想确保根据上一年提交的期末值,一年的说明值正确。借助此多索引数据框,我尝试解释我的问题:

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()

我想做的是用比率创建一个附加列。因此,例如:Unit 2 year 2016 col3 / Unit 2 year 2015 col 4 = 4/4 =1。我的下一步将是查看比率是否为1。我在此数据框中输入一个示例,比率不会为1 。从原则上讲,这是我的关注点,我想识别该数据点。

我遇到的一个问题是我的数据帧中有很多零。

谢谢您的输入!

Jen

1 个答案:

答案 0 :(得分:1)

IIUC,您可以在groupby上应用一个函数:

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的那些。