大熊猫对每个类别的计算

时间:2018-07-25 14:21:07

标签: python python-3.x pandas for-loop if-statement

我很难正确地将熊猫与for循环和if语句结合使用。我将通过一个示例来说明我要实现的目标以及当前正在做什么。

考虑到我有六个人(指数代表该人)已经完成了A,B,C的某些课程。他们都获得了如下所示的等级:

Index    Grade     Course
0        2         A
1        4.5       B
2        6         B
3        6.5       C
4        7.5       A
5        9         A

现在假设我想获得累积平均成绩(在我的实际问题中,我想获得帝国累积分布函数,但是我希望更多的人可以通过简单地关注实际问题来帮助我)。将人0的等级表示为g_0,将人1的等级表示为g_1,依此类推。然后,人0的累积平均等级可以计算为(请注意,我故意按等级排序):g_0 /6。对于人1而言: (g_0 + g_1)/6。依此类推。

现在我真正想做的就是按类别进行此操作。因此,对于每个类别,我想分别计算该累计平均值,但最终要在同一列中。这样,它的功能就可以以另一种方式比较人们的等级。

让我们用Cag表示累积平均成绩,那么我们希望:

Index    Grade     Course     Cag
0        2         A          0.66      (2/3)  
1        4.5       B          2.25      (4.5/2)
2        6         B          5.25      ((4.5 + 6)/2)
3        6.5       C          6.5       (6.5/1)
4        7.5       A          3.17      ((2 + 7.5) / 3)
5        9         A          6.17      ((2 + 7.5 + 9) / 3)

最终我想在for循环中执行此操作,因为我有很多课程而不是3门课程。现在我将要做的(但不起作用)如下:

 df = pd.DataFrame({ 'grd' : (2, 4.5, 6, 6.5, 7.5, 9),
                'cou' : pd.Categorical(["A", "B", "B", "C", "A", "A"])})
 iLen = len(df.grd)
 df['cgr'] = pd.Series(np.zeros(iLen), index = df.index)

 lCou = set(df.cou)


 for i in lCou:
     z = 0 
     n = sum(df.cou == i)
     for row in df['cou']:
         if i == row:
             z = (z + df['grd']) / n
             df['cgr'] = z

不幸的是,它没有执行我想要的操作。预先感谢您尝试帮助我!

1 个答案:

答案 0 :(得分:2)

这应该做到:

df = pd.DataFrame({'Grade': [2.0, 4.5, 6.0, 6.5, 7.5, 9.0],
                   'Index': [0, 1, 2, 3, 4, 5],
                   'Course': ['A', 'B', 'B', 'C', 'A', 'A']})

df['Cag'] = (df.groupby('Course')['Grade'].transform('cumsum') / df.groupby('Course')['Index'].transform('count')).round(2)

df
#  Course  Grade  Index   Cag
#0      A    2.0      0  0.67
#1      B    4.5      1  2.25
#2      B    6.0      2  5.25
#3      C    6.5      3  6.50
#4      A    7.5      4  3.17
#5      A    9.0      5  6.17