我有一个数据框,看起来像这样:
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
答案 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