我很难正确地将熊猫与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
不幸的是,它没有执行我想要的操作。预先感谢您尝试帮助我!
答案 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