Pandas新增Months_Adjusted列:Borrow_Rank变化时从0重置计数
问题说明
现有名为df的pandas DataFrame,包含ID、Months、Borrow_Rank三个字段,原始样例数据如下:
| ID | Months | Borrow_Rank |
|---|---|---|
| 1 | 0 | 1 |
| 1 | 1 | 1 |
| 1 | 2 | 1 |
| 2 | 0 | 1 |
| 2 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 0 | 2 |
| 3 | 1 | 2 |
| 4 | 0 | 1 |
| 4 | 1 | 1 |
需要新增Months_Adjusted列,计数规则为:按原有行顺序遍历,当前行Borrow_Rank取值与上一行不同时,重置计数从0开始;取值与上一行一致时,在上一行计数基础上加1。期望输出结果如下:
| ID | Months | Borrow_Rank | Months_Adjusted |
|---|---|---|---|
| 1 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 |
| 1 | 2 | 1 | 2 |
| 2 | 0 | 1 | 3 |
| 2 | 1 | 1 | 4 |
| 2 | 2 | 1 | 5 |
| 3 | 0 | 2 | 0 |
| 3 | 1 | 2 | 1 |
| 4 | 0 | 1 | 0 |
| 4 | 1 | 1 | 1 |
实现方法
不需要写逐行遍历的循环,用pandas内置的向量化方法即可高效实现,核心逻辑是先识别Borrow_Rank连续相同值的分组,再在每个分组内生成从0开始的顺序计数:
import pandas as pd # 生成连续同值分组的标记:相邻行Borrow_Rank不同时分组号递增 df["group_flag"] = (df["Borrow_Rank"] != df["Borrow_Rank"].shift()).cumsum() # 按分组生成从0开始的顺序计数,即为目标列 df["Months_Adjusted"] = df.groupby("group_flag").cumcount() # 删除临时使用的分组标记列 df.drop(columns="group_flag", inplace=True)
运行上述代码后得到的结果和预期完全一致。该实现为pandas原生向量化运算,数据量较大时运行效率远高于逐行遍历逻辑,且不会改变原数据的行顺序,第一行无前置数据的边界场景也会默认从0开始计数,符合规则要求。
内容的提问来源于stack exchange,提问作者simply_here
相关产品推荐
相关产品推荐

