Pandas 重复(并列)分数的排名
Pandas rank accounting for duplicate (tied) scores
假设我有比赛参与者的数据。列是 id 和 score。
import numpy as np
import pandas as pd
import random
d = {'id':list(range(10)),
'score':[10,10,8,8,8,5,4,3,2,1]}
df = pd.DataFrame(d)
df['rank'] = df['score'].rank(method='dense',ascending=False)
看起来像
id score rank
0 0 10 1.0
1 1 10 1.0
2 2 8 2.0
3 3 8 2.0
4 4 8 2.0
5 5 5 3.0
6 6 4 4.0
7 7 3 5.0
8 8 2 6.0
9 9 1 7.0
这几乎是完美的。但是,在比赛中,如果两个参赛者并列第一,那么下一个就是第三名。 (但是,我们得到 2)。同样,如果以下 3 名参与者各得 8 分,则应分别排在第 3 位。以下5号分数不并列,所以应该是6,7,8,9,10.
如何实现这种效果? rank(method='dense')
让我走到这一步,但是 pandas df.rank()
没有 出现 有一个选项可以让我得到 100% 的解决方案。
来自评论,迈克尔协助。
import numpy as np
import pandas as pd
import random
d = {'id':list(range(10)),
'score':[10,10,8,8,8,5,4,3,2,1]}
df = pd.DataFrame(d)
df['rank'] = df['score'].rank(method='min',ascending=False)
假设我有比赛参与者的数据。列是 id 和 score。
import numpy as np
import pandas as pd
import random
d = {'id':list(range(10)),
'score':[10,10,8,8,8,5,4,3,2,1]}
df = pd.DataFrame(d)
df['rank'] = df['score'].rank(method='dense',ascending=False)
看起来像
id score rank
0 0 10 1.0
1 1 10 1.0
2 2 8 2.0
3 3 8 2.0
4 4 8 2.0
5 5 5 3.0
6 6 4 4.0
7 7 3 5.0
8 8 2 6.0
9 9 1 7.0
这几乎是完美的。但是,在比赛中,如果两个参赛者并列第一,那么下一个就是第三名。 (但是,我们得到 2)。同样,如果以下 3 名参与者各得 8 分,则应分别排在第 3 位。以下5号分数不并列,所以应该是6,7,8,9,10.
如何实现这种效果? rank(method='dense')
让我走到这一步,但是 pandas df.rank()
没有 出现 有一个选项可以让我得到 100% 的解决方案。
来自评论,迈克尔协助。
import numpy as np
import pandas as pd
import random
d = {'id':list(range(10)),
'score':[10,10,8,8,8,5,4,3,2,1]}
df = pd.DataFrame(d)
df['rank'] = df['score'].rank(method='min',ascending=False)