如何对Pandas DataFrame按一列升序、另一列降序排名?
Pandas 多列优先级排名实现方法
你可以通过构造复合排序键,结合rank()方法实现需求,完全不需要大量IF语句:
- 先按指定规则排序:
# of hits升序,% chance降序 - 对排序后的结果用
rank(method='first')分配唯一排名,保证并列时按排序顺序打破平局
完整代码
# 链式写法,直接生成排名并映射回原DataFrame df['Rank'] = (df.sort_values(by=['# of hits', '% chance'], ascending=[True, False]) .rank(method='first', ascending=False)['# of hits'] .astype(int) .reindex(df.index))
分步写法(更易理解)
# 1. 按规则排序数据 df_sorted = df.sort_values(by=['# of hits', '% chance'], ascending=[True, False]) # 2. 生成排名,method='first'确保并列时按排序顺序分配唯一值 df_sorted['Rank'] = df_sorted.rank(method='first', ascending=False)['# of hits'].astype(int) # 3. 将排名映射回原DataFrame(保留原始行顺序) df = df.merge(df_sorted[['# of hits', '% chance', 'Rank']], on=['# of hits', '% chance'], how='left')
结果验证
运行后会得到你预期的排名:
| # of hits | % chance | Rank |
|---|---|---|
| 1 | 50 | 2 |
| 2 | 100 | 3 |
| 1 | 95 | 1 |
| 3 | 75 | 5 |
| 2 | 60 | 4 |
关键说明
sort_values的ascending参数传入列表,分别对应每列的排序方向:True为升序,False为降序rank(method='first')会按照排序后的行顺序分配排名,彻底避免并列时的重复排名问题reindex(df.index)用于将排名结果还原到原DataFrame的原始行顺序
内容的提问来源于stack exchange,提问作者Shazbah
相关产品推荐
相关产品推荐

