我有一个数据框
df:
索引 | A | 乙 | 排名 |
---|---|---|---|
1 | 55 | 27 | 1.0 |
2 | 62 | 15 | 2.5 |
3 | 76 | 15 | 2.5 |
4 | 85 | 04 | 4.0 |
'Rank'
列是通过按降序排列'B'
创建的。与:
df['Rank'] = df['B'].rank(ascending = False)
在
2
和3
行中分配的等级相同。每当有相同的排名分配给两个不同的行时,我想通过按降序使用列 'A'
的值来打破平局,以便包含较高 'A'
值的行获得较低的排名。
期望的输出:
索引 | A | 乙 | 排名 |
---|---|---|---|
1 | 55 | 27 | 1.0 |
2 | 62 | 15 | 3.0 |
3 | 76 | 15 | 2.0 |
4 | 85 | 04 | 4.0 |
编辑: 我想先按
'B'
对其进行排名,然后仅使用'A'
来决定相同排名的元素,这样所有其他排名仍然仅由'B'
决定。
sort_values
和numpy的一个选项:
order = df.sort_values(by=['B', 'A'], ascending=[False, False]).index
df.loc[order, 'Rank'] = np.arange(len(df))+1
rank
的变体:
df['Rank'] = (df.sort_values(by=['B', 'A'], ascending=[False, False])['B']
.rank(method='first', ascending=False)
)
输出:
Index A B Rank
0 1 55 27 1
1 2 62 15 3
2 3 76 15 2
3 4 85 4 4