Pandas按Rank自定义排序规则分组生成递增值新列的实现方法
实现方法
核心思路是利用Pandas有序分类类型自定义Rank优先级,配合原生分组排序编号逻辑实现需求,全程走向量化运算,是处理千万级以下数据集效率最高的方案,同时支持灵活修改优先级规则。
完整实现代码
import pandas as pd # 构造示例数据集 data = { 'Name': ['A','A','A','A','A','B','B','B','B','C','C','C'], 'Rank': ["'A3'","'A3'","'A2'","'A2'","'A2'","'A1'","'A1'","'A1'","'A1'","'A3'","'A3'","'A2'"], 'Months': [2,2,3,3,3,4,4,4,4,2,2,1] } df = pd.DataFrame(data) # 1. 自定义Rank优先级,优先级从高到低,后续调整顺序直接修改该列表即可 # 如果你的Rank列无单引号,直接改为 rank_priority = ["A1", "A2", "A3"] rank_priority = ["'A1'", "'A2'", "'A3'"] # 2. 将Rank列转为有序分类类型,自动遵循指定优先级排序 df['Rank'] = pd.Categorical(df['Rank'], categories=rank_priority, ordered=True) # 3. 分组生成递增编号,保留原始行顺序 df['NewIncremental'] = 'P' + df.groupby('Name', group_keys=False)\ .apply(lambda x: x.sort_values('Rank').cumcount() + 1)\ .astype(str)\ .sort_index() print(df)
逻辑说明
- 有序分类类型的设计天然支持自定义排序规则,不需要额外做数值映射,修改优先级时只需调整
rank_priority列表顺序 - 分组内按Rank优先级排序后生成编号,再通过
sort_index()映射回原始行的位置,不会打乱原始数据的排列顺序 - 所有操作都是Pandas原生向量化实现,避免Python级别的循环,性能远高于自定义遍历逻辑
输出结果
运行后输出完全匹配预期:
Name Rank Months NewIncremental 0 A 'A3' 2 P4 1 A 'A3' 2 P5 2 A 'A2' 3 P1 3 A 'A2' 3 P2 4 A 'A2' 3 P3 5 B 'A1' 4 P1 6 B 'A1' 4 P2 7 B 'A1' 4 P3 8 B 'A1' 4 P4 9 C 'A3' 2 P2 10 C 'A3' 2 P3 11 C 'A2' 1 P1
内容的提问来源于stack exchange,提问作者DockerUser12
相关产品推荐
相关产品推荐

