Power BI中基于条件合并多行并将PART分类至CLASS A/B列
表格数据归类与合并问题
需求说明
现有如下结构的表格:
| Arrangements | PREFIX | RANGE | PART | TYPE |
|---|---|---|---|---|
| ARR1 | 1XJ | 1-100 | 191123 | TRANSMISSION CLASS A |
| ARR1 | 1XJ | 1-100 | 299123 | TRANSMISSION CLASS B |
| ARR1 | 9TC | 1-100 | 191123 | TRANSMISSION CLASS A |
| ARR2 | 5TJ | 101-120 | 288123 | TRANSMISSION CLASS B |
需要新增CLASS A和CLASS B两列,按照以下规则对PART进行归类:
- 若
Arrangements、PREFIX、RANGE三者完全相同,该组内所有PART需同时出现在CLASS A和CLASS B列 - 不满足上述条件时,根据TYPE列判断:TYPE包含CLASS A则PART放入CLASS A列,包含CLASS B则放入CLASS B列
当前遇到的问题:已完成部分归类,但无法将三者相同的多行合并为一行。
解决方案
方案1:Excel实现(公式+去重)
添加分组标记列:在现有表格后新增
GROUP_KEY列,第一个单元格输入公式:=A2&B2&C2下拉填充至所有行,用于标记同一组的行。
生成CLASS A列:在新列第一个单元格输入数组公式(输入后按
Ctrl+Shift+Enter):=IF(COUNTIF($F$2:$F$5,F2)>1,TEXTJOIN(", ",TRUE,$D$2:$D$5*($F$2:$F$5=F2)),IF(ISNUMBER(SEARCH("CLASS A",$E$2)),$D$2,""))下拉填充。
生成CLASS B列:在另一新列第一个单元格输入数组公式(按
Ctrl+Shift+Enter):=IF(COUNTIF($F$2:$F$5,F2)>1,TEXTJOIN(", ",TRUE,$D$2:$D$5*($F$2:$F$5=F2)),IF(ISNUMBER(SEARCH("CLASS B",$E$2)),$D$2,""))下拉填充。
删除重复行:选中所有数据区域,点击「数据」→「删除重复值」,以
GROUP_KEY列为依据去重,最终得到合并后的结果。
方案2:Python Pandas实现
import pandas as pd # 加载数据(实际使用时可替换为pd.read_excel/csv读取外部文件) df = pd.DataFrame({ 'Arrangements': ['ARR1', 'ARR1', 'ARR1', 'ARR2'], 'PREFIX': ['1XJ', '1XJ', '9TC', '5TJ'], 'RANGE': ['1-100', '1-100', '1-100', '101-120'], 'PART': ['191123', '299123', '191123', '288123'], 'TYPE': ['TRANSMISSION CLASS A', 'TRANSMISSION CLASS B', 'TRANSMISSION CLASS A', 'TRANSMISSION CLASS B'] }) # 标记每组的行数 df['group_size'] = df.groupby(['Arrangements', 'PREFIX', 'RANGE'])['PART'].transform('count') # 定义分组处理逻辑 def process_group(group): parts = group['PART'].tolist() # 组内多行时,所有PART同时放入两列 if len(group) > 1: return pd.Series({ 'CLASS A': ', '.join(parts), 'CLASS B': ', '.join(parts) }) # 组内单行时,按TYPE判断归类 else: row = group.iloc[0] class_a = row['PART'] if 'CLASS A' in row['TYPE'] else '' class_b = row['PART'] if 'CLASS B' in row['TYPE'] else '' return pd.Series({'CLASS A': class_a, 'CLASS B': class_b}) # 分组处理并重置索引 result = df.groupby(['Arrangements', 'PREFIX', 'RANGE']).apply(process_group).reset_index() # 输出结果 print(result)
运行后输出结果:
Arrangements PREFIX RANGE CLASS A CLASS B 0 ARR1 1XJ 1-100 191123, 299123 191123, 299123 1 ARR1 9TC 1-100 191123 2 ARR2 5TJ 101-120 288123
内容的提问来源于stack exchange,提问作者subhro
相关产品推荐
相关产品推荐

