我已经找到了如何对具有多列的数据框进行排名,但前提是它们都是降序或升序,但是我希望以升序对数据框进行排名,然后如果使用第二列排序有平局按降序排列。
这就是我要找的:
点击次数 | % 几率 | 排名 |
---|---|---|
1 | 50 | 2 |
2 | 100 | 3 |
1 | 95 | 1 |
3 | 75 | 5 |
2 | 60 | 4 |
这是我目前拥有的:
df['Rank'] = df["点击次数"].rank(ascending=True,method="dense").astype(int)
这就是我目前所拥有的,然后我有一列基本上是“%机会”,因此100%是排名中的“最佳”。我找不到任何在“两个方向”排名的东西,所以我目前正在使用 IF 语句来检查是否有两个 Rank == 1,然后使用更多 IF 语句来解决平局,但我认为必须有一个对这些数据框进行排名的更好方法。
col1=df1.sort_values(df1.columns.tolist(),ascending=[True,False]).assign(col1=range(1,df1.pipe(len)+1)).col1
df1.assign(rank=col1)
输出:
ofhits chance rank
0 1 50 2
1 2 100 3
2 1 95 1
3 3 75 5
4 2 60 4
sort_values
,然后numpy.argsort
:
df['Rank'] = np.argsort(df.reset_index(drop=True) # optional
.sort_values(by=['# of hits', '% chance'],
ascending=[True, False])
.index)+1
reset_index
是可选的,仅当索引尚未排序时才需要它。
输出:
# of hits % chance Rank
0 1 50 2
1 2 100 3
2 1 95 1
3 3 75 5
4 2 60 4
可重复输入:
df = pd.DataFrame({'# of hits': [1, 2, 1, 3, 2],
'% chance': [50, 100, 95, 75, 60]})
您还可以使用
rank(method='first)
df['Rank'] = df.sort_values('% chance',ascending=False)['# of hits'].rank(method = 'first').astype(int)
或:
df[['# of hits','% chance']].mul([1,-1]).apply(tuple,axis=1).rank(method = 'dense')
输出:
# of hits % chance Rank
0 1 50 2
1 2 100 3
2 1 95 1
3 3 75 5
4 2 60 4