我有基于每日数据的以下分组数据框
Studentid Year Month BookLevel
JSmith 2015 12 1.4
2016 1 1.6
2 1.8
3 1.2
4 2.0
MBrown 2016 1 3.0
2 3.2
3 3.6
我想计算每个Studentid与BookLevel起点的差异。当前的BookLevel是GroupBy的.max计算,以获得每个学生每月最高的bookLevel
我正在寻找的是这样的:
Studentid Year Month BookLevel Progress Since Start
JSmith 2015 12 1.4 0 (or NAN)
2016 1 1.6 .2
2 1.8 .4
3 1.2 -.2
4 2.0 .6
2016 1 3.0 0 (or NAN)
MBrown 2 3.2 .2
3 3.6 .6
我是Python / Pandas的新手,已经尝试了很多东西,没有什么可以接近的。
答案 0 :(得分:2)
好的,这应该有用,如果我们在第一级$ret
并通过groupby
调用transform
从系列中减去BookLevel,那么我们可以将其添加为新的所需列:
first
答案 1 :(得分:1)
我不太清楚如何使用多个索引复制数据框。所以我只是形成自己的。仅供参考:你放置原始dataframe
会很棒,所以我可以使用pd.read_clipboard()
。以下是我如何形成df
df = pd.DataFrame({'BookLevel': [1.4, 1.6, 1.8, 1.2, 2.0, 3.0, 3.2, 3.6],
'Month': [12,1,2,3,4,1,2,3],
'Studentid': ['JSmith']*5 + ['MBrown']*3,
'Year': [2015]+[2016]*7})
df = df.set_index(['Studentid', 'Year', 'Month'])
<强>解决方案:强>
此处,我将Multiindex Groupby
与given level=0
用于群组,然后使用diff
查找连续行的差异,然后使用cumsum
查找累积总和差:
rslt = pd.concat([v.diff().cumsum() for n, v in df.groupby(level=0)])
输出
rslt
Out[151]:
BookLevel
Studentid Year Month
JSmith 2015 12 NaN
2016 1 0.2
2 0.4
3 -0.2
4 0.6
MBrown 2016 1 NaN
2 0.2
3 0.6
如果想要使最终的df完全如您所示,请执行以下格式化:
rslt.columns=['ProgressSinceStart']
rslt['BookLevel']=df['BookLevel']
<强>输出:强>
rslt
Out[153]:
ProgressSinceStart BookLevel
Studentid Year Month
JSmith 2015 12 NaN 1.4
2016 1 0.2 1.6
2 0.4 1.8
3 -0.2 1.2
4 0.6 2.0
MBrown 2016 1 NaN 3.0
2 0.2 3.2
3 0.6 3.6