如何按Product_id分组,为Sub_product生成组内连续Priority?
问题:按Product_id分组生成组内连续的Priority编号
现有包含Product_id、Sub_product、Category字段的数据集,需为每个Product_id下的Sub_product按指定Category优先级规则(Superior=1、High-valued=2、VALUE=3、AddOn=4)排序并设置Priority值。目前通过派生列实现了全局连续的Priority,但期望每个Product_id组内的Priority从1开始连续编号,该需求是否可实现?
解决方案:完全可以实现
核心思路是按Product_id分组,在每个组内先根据Category的优先级规则排序,再生成组内从1开始的连续编号。以下是几种常用工具的实现方法:
1. SQL实现
利用窗口函数ROW_NUMBER()结合PARTITION BY分组,同时通过CASE语句映射Category的优先级:
SELECT Product_id, Sub_product, Category, ROW_NUMBER() OVER ( PARTITION BY Product_id ORDER BY CASE Category WHEN 'Superior' THEN 1 WHEN 'High-valued' THEN 2 WHEN 'VALUE' THEN 3 WHEN 'AddOn' THEN 4 END ASC ) AS Priority FROM your_dataset;
PARTITION BY Product_id:将数据集按产品ID拆分独立分组ORDER BY中的CASE:把Category转换成指定的优先级数值,确保排序符合要求ROW_NUMBER():在每个分组内生成从1开始的连续编号
2. Power Query实现
通过分组+组内排序+添加组内索引完成:
- 添加自定义列,映射Category到优先级数值:
= if [Category] = "Superior" then 1 else if [Category] = "High-valued" then 2 else if [Category] = "VALUE" then 3 else 4 - 按
Product_id分组:选中Product_id列,点击「转换」→「分组依据」,操作选择「所有行」,新列名设为GroupedRows - 展开
GroupedRows列,在展开后的子表中按自定义的优先级列排序 - 添加组内索引列:点击「添加列」→「索引列」→「从1开始」(确保是在分组后的子表中操作)
- 整理列,保留需要的字段即可
3. Python Pandas实现
通过分组后排名的方式生成组内连续编号:
import pandas as pd # 定义Category与优先级的映射关系 cat_priority_map = {'Superior': 1, 'High-valued': 2, 'VALUE': 3, 'AddOn': 4} # 给数据集添加优先级数值列 df['cat_priority'] = df['Category'].map(cat_priority_map) # 按Product_id分组,组内按优先级排序,生成从1开始的连续编号 df['Priority'] = df.groupby('Product_id')['cat_priority'].rank(method='first', ascending=True).astype(int) # 可选:删除中间生成的cat_priority列 df = df.drop(columns=['cat_priority'])
groupby('Product_id'):按产品ID拆分分组rank(method='first'):确保同优先级的Sub_product按原有顺序编号,避免重复值astype(int):将排名结果转为整数,得到标准的连续编号
内容的提问来源于stack exchange,提问作者Arunbi
相关产品推荐
相关产品推荐

