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)
使用的组合groupby和sort_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)