如何对Pandas分组后的不同Side分别按升序、降序计算rank?
针对不同Side分组使用不同排序计算Rank的解决方案
你当前的代码对所有Side分组统一采用默认的升序排序计算排名,要实现不同Side用不同排序规则,可以用以下两种简洁方法:
方法一:分组自定义排序逻辑
通过groupby.apply对每个分组单独设置排序方向,灵活适配不同Side的需求:
def calculate_rank(group): # 根据分组的Side值确定排序方向,这里假设Side=1用降序,Side=0用升序,可按需调整 sort_ascending = False if group['Side'].iloc[0] == 1 else True group['Position'] = group['Price'].rank(ascending=sort_ascending).astype('int') - 1 return group # 应用分组逻辑并更新DataFrame d = d.groupby('Side', group_keys=False).apply(calculate_rank)
方法二:条件判断分别计算
直接针对不同Side单独计算排名,再用np.where合并结果,逻辑更直观:
import numpy as np # 分别计算两个Side的排名 rank_side0 = d[d['Side'] == 0]['Price'].rank(ascending=True).astype('int') - 1 rank_side1 = d[d['Side'] == 1]['Price'].rank(ascending=False).astype('int') - 1 # 将结果赋值回Position列 d['Position'] = np.where(d['Side'] == 0, rank_side0, rank_side1)
验证说明
以你的示例数据为例:
Side=1的Price从0.7289到0.7298,用降序排名后减1,得到的Position从9到0,和原数据一致;Side=0的Price从0.7299到0.7308,用升序排名后减1,得到的Position从0到9,也和原数据匹配。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

