在Pandas中实现分组内多列排名并支持并列
分组内基于多列的并列排名实现方案
核心解决方案
要实现分组内基于多列的并列排名,可在每个分组内部将用于排名的多列组合为可比较的元组,再使用rank()方法并指定method='min'参数来保留并列排名。具体代码如下:
import pandas as pd df = pd.DataFrame({'row_id':[1,2,3,4,5,6,7,8,9,10], 'Group':[1,1,1,1,1,2,2,2,2,2], 'Var1':[100,100,100,200,200,300,300,400,400,400], 'Var2':[5,5,6,7,8,1,1,2,2,3]}) # 实现分组内多列并列排名 df['Rank'] = df.groupby('Group').apply( lambda x: x[['Var1', 'Var2']].apply(tuple, axis=1).rank(method='min', ascending=True) ).reset_index(level=0, drop=True).astype(int) print(df)
输出结果
运行后将得到符合预期的排名:
row_id Group Var1 Var2 Rank 0 1 1 100 5 1 1 2 1 100 5 1 2 3 1 100 6 3 3 4 1 200 7 4 4 5 1 200 8 5 5 6 2 300 1 1 6 7 2 300 1 1 7 8 2 400 2 3 8 9 2 400 2 3 9 10 2 400 3 5
代码说明
- 分组处理:通过
groupby('Group')将数据按分组拆分,确保每个分组内的排名独立计算。 - 多列组合:在每个分组内部,使用
apply(tuple, axis=1)将Var1和Var2的每行值组合成元组,相同的数值组合会被识别为同一键。 - 并列排名设置:调用
rank(method='min'),保证相同元组对应的行获得相同的最小排名;ascending=True指定按数值从小到大排序。 - 结果格式化:用
reset_index去除分组索引,astype(int)将排名转换为整数类型,匹配预期输出格式。
此前方法失效原因
之前使用cumsum()的方法仅对分组内的行进行累加计数,未识别Var1和Var2的重复组合,导致相同数值的行获得递增排名。本方案通过多列组合+rank方法的参数设置,有效解决了并列排名的识别问题。
内容的提问来源于stack exchange,提问作者Felipe D.
相关产品推荐
相关产品推荐

