使用Pandas groupby中的第一行来计算累积差异

时间:2016-06-04 20:38:14

标签: python pandas

我有基于每日数据的以下分组数据框

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的新手,已经尝试了很多东西,没有什么可以接近的。

2 个答案:

答案 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 Groupbygiven 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