熊猫排名方法密集但跳过一个数字

Jes*_*ica 3 python rank pandas

我有一个示例数据集,我正在尝试根据"HP"列中的值进行排名:

import pandas as pd

d = {
 'unit': ['UD', 'UD', 'UD' ,'UC','UC', 'UC','UA','UA','UA','UB','UB','UB'],
 'N-D': [ 'C1', 'C2', 'C3','Q1', 'Q2', 'Q3','D1','D2','D3','E1','E2','E3'],
 'HP': [24, 24, 24,7,7,7,7,7,7,5,5,5]
}
df = pd.DataFrame(d)

df['rank']=df['HP'].rank(ascending=False, method='dense')

df
Run Code Online (Sandbox Code Playgroud)

看起来像:

    HP N-D unit  rank
0   24  C1   UD   1.0
1   24  C2   UD   1.0
2   24  C3   UD   1.0
3    7  Q1   UC   2.0
4    7  Q2   UC   2.0
5    7  Q3   UC   2.0
6    7  D1   UA   2.0
7    7  D2   UA   2.0
8    7  D3   UA   2.0
9    5  E1   UB   3.0
10   5  E2   UB   3.0
11   5  E3   UB   3.0
Run Code Online (Sandbox Code Playgroud)

'HP'是基于其他列的计算列(我不会在这里显示,但它在我的真实数据集中是必要的)

我也尝试了方法='min'但结果如下:

    HP N-D unit  rank
0   24  C1   UD   1.0
1   24  C2   UD   1.0
2   24  C3   UD   1.0
3    7  Q1   UC   4.0
4    7  Q2   UC   4.0
5    7  Q3   UC   4.0
6    7  D1   UA   4.0
7    7  D2   UA   4.0
8    7  D3   UA   4.0
9    5  E1   UB  10.0
10   5  E2   UB  10.0
11   5  E3   UB  10.0
Run Code Online (Sandbox Code Playgroud)

单位'UC'和'UA'并列第二等级,我正在寻找的是下一个等级,单位'UB'为'4'而不是'3'.:

    HP N-D unit  rank
0   24  C1   UD   1.0
1   24  C2   UD   1.0
2   24  C3   UD   1.0
3    7  Q1   UC   2.0
4    7  Q2   UC   2.0
5    7  Q3   UC   2.0
6    7  D1   UA   2.0
7    7  D2   UA   2.0
8    7  D3   UA   2.0
9    5  E1   UB   4.0
10   5  E2   UB   4.0
11   5  E3   UB   4.0
Run Code Online (Sandbox Code Playgroud)

piR*_*red 5

使用的组合groupbysort_values

g = df.sort_values(
    ['HP', 'unit'], ascending=False
).groupby(['HP', 'unit'], sort=False)

df.assign(rank=g.ngroup().add(1).groupby(df.HP).transform('first'))

    HP N-D unit  rank
0   24  C1   UD     1
1   24  C2   UD     1
2   24  C3   UD     1
3    7  Q1   UC     2
4    7  Q2   UC     2
5    7  Q3   UC     2
6    7  D1   UA     2
7    7  D2   UA     2
8    7  D3   UA     2
9    5  E1   UB     4
10   5  E2   UB     4
11   5  E3   UB     4
Run Code Online (Sandbox Code Playgroud)

使用nunique和的另一种方式map

df.assign(
    rank=df.HP.map(
        df.sort_values(
            ['HP', 'unit'], ascending=False
        ).groupby(
            'HP', sort=False
        ).unit.nunique().shift().fillna(1).cumsum())
)

    HP N-D unit  rank
0   24  C1   UD   1.0
1   24  C2   UD   1.0
2   24  C3   UD   1.0
3    7  Q1   UC   2.0
4    7  Q2   UC   2.0
5    7  Q3   UC   2.0
6    7  D1   UA   2.0
7    7  D2   UA   2.0
8    7  D3   UA   2.0
9    5  E1   UB   4.0
10   5  E2   UB   4.0
11   5  E3   UB   4.0
Run Code Online (Sandbox Code Playgroud)