如何计算学生在熊猫某学科中获胜的时间

时间:2018-10-18 16:59:58

标签: 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
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在某些科目中的表现也更好(例如,科目ID 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

2 个答案:

答案 0 :(得分:3)

使用

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

答案 1 :(得分:2)

您可以使用pd.DataFrame.pivot,然后通过loc进行分配。

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