按列分组并按B/C/D优先级筛选行数据的技术需求
分组筛选指定优先级行问题
原始数据
| C1 | C2 | C3 |
|---|---|---|
| 1 | A | 1000 |
| 1 | B | 2000 |
| 1 | C | 3000 |
| 1 | D | 4000 |
| 1 | E | 5000 |
| 2 | A | 1000 |
| 2 | D | 4000 |
| 2 | E | 5000 |
| 3 | A | 1000 |
| 3 | B | 2000 |
| 3 | D | 4000 |
| 3 | E | 5000 |
需求说明
按C1列分组,每组内优先筛选C2值为B的行;若该组无C2=B的行,则筛选C2值为C的行;若仍不存在,则筛选C2值为D的行。
预期结果
| C1 | C2 | C3 |
|---|---|---|
| 1 | B | 2000 |
| 2 | D | 4000 |
| 3 | B | 2000 |
解决方案
SQL实现
通过给目标C2值分配优先级,利用窗口函数分组排序后取第一行:
WITH ranked_rows AS ( SELECT C1, C2, C3, ROW_NUMBER() OVER ( PARTITION BY C1 ORDER BY CASE C2 WHEN 'B' THEN 1 WHEN 'C' THEN 2 WHEN 'D' THEN 3 ELSE 4 END ) AS rank_num FROM your_table_name ) SELECT C1, C2, C3 FROM ranked_rows WHERE rank_num = 1 AND C2 IN ('B', 'C', 'D');
Pandas实现
通过映射优先级值,分组筛选优先级最高的行:
import pandas as pd # 构造数据(或从文件读取) df = pd.DataFrame({ 'C1': [1,1,1,1,1,2,2,2,3,3,3,3], 'C2': ['A','B','C','D','E','A','D','E','A','B','D','E'], 'C3': [1000,2000,3000,4000,5000,1000,4000,5000,1000,2000,4000,5000] }) # 定义优先级规则 priority_map = {'B': 1, 'C': 2, 'D': 3} # 过滤出目标C2值并添加优先级列 filtered_df = df[df['C2'].isin(priority_map.keys())].assign(priority=lambda x: x['C2'].map(priority_map)) # 分组取每组优先级最小的行 result = filtered_df.groupby('C1').apply(lambda x: x[x['priority'] == x['priority'].min()]).reset_index(drop=True) # 移除临时优先级列 result = result.drop(columns='priority') print(result)
内容的提问来源于stack exchange,提问作者user3315201
相关产品推荐
相关产品推荐

