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