如何计算学生在某一科目中获得多少次成绩

2024-09-28 21:04:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:

subjectID subjectMark totalMark  Rank   studentID
21376     52.000002   89.333335     2    10  
21376     55.999998   91.6455245    1    11   
21377     18.666666   89.333335     2    10   
21377     17.333334   91.6455245    1    11
21379     4.3333335   89.333335     2    10
21379     4           91.6455245    1    11   
21380     4.3333335   89.333335     2    10
21380     4.3333335   91.6455245    1    11
22601     10          89.333335     2    10
22601     9.978859    91.6455245    1    11

从上面可以看出,学生10在某些科目(如21377科目和22601科目)上表现更好,尽管总分排名第二,但我想统计一下,排名第二的学生有多少科目比排名第一的学生得分更高。你知道吗

所以我希望df像下面这样:

subjectID subjectMark totalMark  Rank   studentID #ofTimesBetteThan1st
21376     52.000002   89.333335     2    10       2
21376     55.999998   91.6455245    1    11       0
21377     18.666666   89.333335     2    10       2
21377     17.333334   91.6455245    1    11       0
21379     4.3333335   89.333335     2    10       2
21379     4           91.6455245    1    11       0
21380     4.3333335   89.333335     2    10       2
21380     4.3333335   91.6455245    1    11       0
22601     10          89.333335     2    10       2
22601     9.978859    91.6455245    1    11       0

Tags: 数据df学生rank科目总分studentidsubjectid
2条回答

可以使用^{},后跟通过^{}的赋值。你知道吗

df_pvt = df.pivot(index='subjectID', columns='studentID', values='subjectMark')

df['Count_Better_than_1st'] = 0
df.loc[df['Rank'] == 2, 'Count_Better_than_1st'] = (df_pvt[10] > df_pvt[11]).sum()


print(df)

   subjectID  subjectMark  totalMark  Rank  studentID  Count_Better_than_1st
0      21376    52.000002  89.333335     2         10                      3
1      21376    55.999998  91.645524     1         11                      0
2      21377    18.666666  89.333335     2         10                      3
3      21377    17.333334  91.645524     1         11                      0
4      21379     4.333334  89.333335     2         10                      3
5      21379     4.000000  91.645524     1         11                      0
6      21380     4.333334  89.333335     2         10                      3
7      21380     4.333334  91.645524     1         11                      0
8      22601    10.000000  89.333335     2         10                      3
9      22601     9.978859  91.645524     1         11                      0

以下是df_pvt供参考。学生10的表现有3倍于:

print(df_pvt)

studentID         10         11
subjectID                      
21376      52.000002  55.999998
21377      18.666666  17.333334
21379       4.333334   4.000000
21380       4.333334   4.333334
22601      10.000000   9.978859

使用

df['ofTimesBetteThan1st']=0
df.loc[(df.Rank==2),'ofTimesBetteThan1st']=df.groupby('subjectID').subjectMark.diff().lt(0).sum()
df
Out[834]: 
   subjectID  subjectMark  totalMark  Rank  studentID  ofTimesBetteThan1st
0      21376    52.000002  89.333335     2         10                    3
1      21376    55.999998  91.645524     1         11                    0
2      21377    18.666666  89.333335     2         10                    3
3      21377    17.333334  91.645524     1         11                    0
4      21379     4.333334  89.333335     2         10                    3
5      21379     4.000000  91.645524     1         11                    0
6      21380     4.333334  89.333335     2         10                    3
7      21380     4.333334  91.645524     1         11                    0
8      22601    10.000000  89.333335     2         10                    3
9      22601     9.978859  91.645524     1         11                    0

相关问题 更多 >