Python 如何计算学生在大熊猫某一科目中获胜的次数

Python 如何计算学生在大熊猫某一科目中获胜的次数,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个如下所示的数据帧: 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 21

我有一个如下所示的数据帧:

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
您可以使用,然后通过分配

以下为
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_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