Pandas按Months分组对R列每2个增量值计算分组排名的实现
Pandas 分组计算等距共享排名实现
实现目标
按Months列做分组维度,每个分组内对R列按数值大小将连续递增值每2个划分为同一个排名区间,区间序号从1开始计数,完全匹配规则:
- R=1、2 → 排名1
- R=3、4 → 排名2
- R=5、6 → 排名3
- R=7 → 排名4
完整可运行代码
import pandas as pd # 替换为你实际的DataFrame读取逻辑即可 df = pd.DataFrame({ "Months": ["2020-10"]*4 + ["2020-11"]*6 + ["2020-12"]*3, "R": [1, 2, 3, 4, 1, 2, 3, 4, 5, 6, 1, 2, 3] }) # 计算分组共享排名 df["group_rank"] = df.groupby("Months")["R"].transform( lambda s: ((s.rank(method="first") - 1) // 2) + 1 )
逻辑拆解
- 用
groupby("Months")锁定分组范围,所有排名计算都在同月份组内完成,不会跨组干扰 - 用
transform做分组运算,计算结果会自动对齐回原DataFrame的对应行,不需要手动做表合并 - 用
rank(method="first")给组内R值按升序分配从1开始的唯一位置序号,就算后续R值出现重复、不连续的情况,也能准确按R的大小顺序分配位置 - 对位置序号做换算:
(序号 - 1) // 2 + 1,刚好把每2个连续位置归为同一排名组,从1开始计数,完全匹配需求的排名规则
小提示:如果你百分百确定每个月份组内的R都是从1开始、无断点的连续整数,可以把计算简化为
df["group_rank"] = ((df["R"] -1) // 2) + 1,但这种写法容错率很低,只要某个组的R起始值不是1,计算结果就会出错,更推荐使用分组内算相对位置的通用写法。
计算效果示例
跑完代码后得到的结果:
| Months | R | group_rank |
|---|---|---|
| 2020-10 | 1 | 1 |
| 2020-10 | 2 | 1 |
| 2020-10 | 3 | 2 |
| 2020-10 | 4 | 2 |
| 2020-11 | 1 | 1 |
| 2020-11 | 2 | 1 |
| 2020-11 | 3 | 2 |
| 2020-11 | 4 | 2 |
| 2020-11 | 5 | 3 |
| 2020-11 | 6 | 3 |
| 2020-12 | 1 | 1 |
| 2020-12 | 2 | 1 |
| 2020-12 | 3 | 2 |
内容的提问来源于stack exchange,提问作者jjccgoh
相关产品推荐
相关产品推荐

