如何从含重复id的数据集提取对应最高等级status的唯一结果?
问题描述
我有一个包含重复id的数据集,每个id对应不同的status(Gold、Silver、Bronze),需要为每个id保留最高等级的status(优先级:Gold > Silver > Bronze),忽略其他低等级的记录。
原始数据集:
| id | status | Date |
|---|---|---|
| 402 | Gold | 5/3/2019 |
| 402 | Silver | 5/3/2018 |
| 402 | Bronze | 5/1/2018 |
| 405 | Silver | 5/3/2020 |
| 405 | Bronze | 5/3/2019 |
| 408 | Bronze | 5/3/2019 |
| 408 | Gold | 5/3/2020 |
期望结果:405-Silver、402-Gold、408-Gold
方法1:Python Pandas 实现
通过给status分配优先级权重,分组筛选最高等级记录:
import pandas as pd # 加载示例数据(实际使用时可替换为读取文件逻辑) data = pd.DataFrame({ 'id': [402, 402, 402, 405, 405, 408, 408], 'status': ['Gold', 'Silver', 'Bronze', 'Silver', 'Bronze', 'Bronze', 'Gold'], 'Date': ['5/3/2019', '5/3/2018', '5/1/2018', '5/3/2020', '5/3/2019', '5/3/2019', '5/3/2020'] }) # 定义status优先级映射 status_rank = {'Gold': 3, 'Silver': 2, 'Bronze': 1} data['rank'] = data['status'].map(status_rank) # 按id分组,取优先级最高的记录 result = data.sort_values('rank', ascending=False).groupby('id').first().reset_index() # 输出目标格式 output = [f"{row['id']}-{row['status']}" for _, row in result.iterrows()] print('、'.join(output))
逻辑说明
- 给每个status分配对应权重,等级越高权重值越大;
- 按权重降序排序,确保同一id下最高等级记录排在首位;
- 按id分组取第一条记录,即为该id的最高等级status;
- 拼接成要求的字符串格式输出。
方法2:SQL 实现
使用窗口函数筛选每组内的最高等级记录:
WITH ranked_data AS ( SELECT id, status, ROW_NUMBER() OVER ( PARTITION BY id ORDER BY CASE status WHEN 'Gold' THEN 3 WHEN 'Silver' THEN 2 WHEN 'Bronze' THEN 1 END DESC ) AS rn FROM your_table_name ) SELECT CONCAT(id, '-', status) AS result FROM ranked_data WHERE rn = 1;
逻辑说明
PARTITION BY id将数据按id分组;ORDER BY CASE定义status的排序优先级,最高等级排在前面;ROW_NUMBER()给每组内的记录编号,最高等级记录编号为1;- 筛选编号为1的记录,拼接成目标格式输出。
内容的提问来源于stack exchange,提问作者Aakash Singla
相关产品推荐
相关产品推荐

