You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Power BI中基于条件合并多行并将PART分类至CLASS A/B列

表格数据归类与合并问题

需求说明

现有如下结构的表格:

ArrangementsPREFIXRANGEPARTTYPE
ARR11XJ1-100191123TRANSMISSION CLASS A
ARR11XJ1-100299123TRANSMISSION CLASS B
ARR19TC1-100191123TRANSMISSION CLASS A
ARR25TJ101-120288123TRANSMISSION CLASS B

需要新增CLASS A和CLASS B两列,按照以下规则对PART进行归类:

  1. 若Arrangements、PREFIX、RANGE三者完全相同,该组内所有PART需同时出现在CLASS A和CLASS B列
  2. 不满足上述条件时,根据TYPE列判断:TYPE包含CLASS A则PART放入CLASS A列,包含CLASS B则放入CLASS B列

当前遇到的问题:已完成部分归类,但无法将三者相同的多行合并为一行。


解决方案

方案1:Excel实现(公式+去重)

  1. 添加分组标记列:在现有表格后新增GROUP_KEY列,第一个单元格输入公式:

    =A2&B2&C2
    

    下拉填充至所有行,用于标记同一组的行。

  2. 生成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,""))
    

    下拉填充。

  3. 生成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,""))
    

    下拉填充。

  4. 删除重复行:选中所有数据区域,点击「数据」→「删除重复值」,以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:20:16