☰
PowerQuery按列分列与分行详解:订单数据清洗实战指南
2026/10/8 20:06:05 网站建设 项目流程

做数据分析的人应该都有过这种经历:从业务系统导出来的表,看着整整齐齐,一用就发现根本不是那么回事。尤其是那种"一个单元格里塞了五六个值"的数据,比如订单表里一个订单对应多个商品,所有商品ID挤在一个格子里用逗号隔开;又或者一张宽表,日期、区域、品类全铺在列上,想分析的时候却需要让它们"站成一排"。这类问题在PowerBI里其实有非常成熟的解法,核心就是PowerQuery里的两个动作:按列分行和按列分列。也就是说,一个是把一列里的多个值拆到多行,一个是把一列里的多个值拆到多列。再加上一个经常被混在一起说的"逆透视列",基本能覆盖日常90%以上的表格重排需求。

这篇文章我会把这两个操作从原理到实操完整拆一遍,用一个贯穿始终的订单数据案例演示每一步怎么做,还会把我在实际项目中踩过的坑和排查思路整理出来。适合刚接触PowerQuery的初学者照着抄,也适合已经会用一些功能但老是弄混拆分逻辑的进阶用户系统梳理一遍。

1. 先搞清楚要分的是行还是列:两种场景的本质区别

1.1 按列分列到底解的是什么问题

按列分列,在PowerQuery的菜单里其实叫"拆分列"。我习惯把"按列分列"理解为:选中的这一列里,每一个单元格都含有多个被分隔符隔开的信息片段,我们要把这些片段重新排列到同一行的不同列中。

举个例子。你的CRM系统导出过这样的数据:

客户ID联系方式
C00113800000001;zhangsan@email.com
C00213900000002;lisi@email.com

这里的"联系方式"里存了手机号和邮箱,两个片段用分号隔开。如果不上PowerQuery,直接在Excel里用"分列"也能做,但问题在于:一旦数据源更新,你每次都要重新操作一遍。而在PowerQuery里做拆分列,相当于把"按照分号拆成两列"这个逻辑固化进了查询里,刷新数据的时候自动执行。这才是它作为PowerBI清洗数据环节的真正价值。

还有一种是"智能拆分"的场景。比如地址字段是"广东省深圳市南山区xx路xx号",你要拆出省、市、区,用固定分隔符不好使,因为你没法确定分隔符在哪个位置。这时候可以用"按字符数拆分"或"从非数字到数字的转换"等高级选项。这些都属于"按列分列"的范畴,只是拆分依据从"固定的逗号分号"变成了"位置特征或内容特征"。

1.2 按列分行和逆透视:长表 vs 宽表

按列分行和按列分列对应的是同一个功能入口的不同选项。还是拿刚才那个联系方式字段举例,如果我们的分析目标是每个客户和号码、邮箱分别建立一行关联记录,那就需要把一列拆分成多行,而不是多列。

客户ID联系方式
C00113800000001;zhangsan@email.com

分列之后变成:

客户ID拆分后的值
C00113800000001
C001zhangsan@email.com

这个才是真正的"按列分行"。

但这里必须多说一句,在实际项目里,还有一个经常被叫作"按列分行"的操作——逆透视列。两者的区别在于:拆分列处理的是"一个单元格里有多个值",逆透视处理的是"多个列名其实是一个字段的不同取值"。

比如业务给你一张这样的表:

门店一季度二季度三季度
上海店10012090

这里的一季度、二季度、三季度其实是"季度"这个字段的取值,你要做趋势分析,就必须把这三列变成三行。这个动作在PowerQuery里叫"逆透视列",本质上是"把列变成行"。很多人习惯把这个也叫"按列分行",因为它确实让数据从宽变长了。从功能目标上说,拆分行和逆透视列都是把"横向铺开的数据"变"纵向堆叠的数据",但底层逻辑完全不同,实操时选错入口是新手最常见的错误。

2. 实操前先把底子打好:数据源与工具入口

2.1 进入PowerQuery的三种方式

PowerBI里的PowerQuery编辑器,入口其实不止一个。我在项目里最常用的是"主页 -> 转换数据",这样会直接进入编辑器的独立窗口。如果你是从Excel里拿数据,Excel 2016以上版本也有"数据 -> 从表格/区域"进入PowerQuery,和PowerBI里的编辑界面几乎一模一样,所以这篇文章讲的操作你在两边都能用。

还有一个很多人不知道的入口:在PowerBI里选中某个表,右键选择"编辑查询",也能进入PowerQuery。区别不大,只是入口路径不同。但有个使用习惯我强烈建议你养成:进入PowerQuery编辑器之后,先看一眼右侧的"查询设置"面板,里面记录了每一步操作历史。PowerQuery最重要的特性之一就是每一步操作都会生成一个步骤记录,你可以在后续随时修改中间的某个步骤,而不是像Excel操作那样做一步忘一步。这个特性意味着,一次数据整理流程可以反复调整,不必从头再来。

2.2 判断该用"拆分列"还是"逆透视"的四步自查法

工具入口清楚了之后,下一步是判断数据该用哪种处理逻辑。我在带新人的时候总结过一个四步自查法,你可以直接拿去用:

第一步,看目标结构。目标是"列数变多,行数不变"还是"行数变多,列数变少"?前者是分列,后者大概率是分行或逆透视。

第二步,看"多个值"藏在哪。值都缩在同一个单元格里,用分隔符隔着——这是拆分列或拆分行。值分散在多个列名里,列名本身是数据的一部分——这是逆透视。

第三步,看分隔符是否统一。同一个字段里如果既有中文逗号又有英文逗号还混着分号,拆分之前必须先清洗分隔符,否则拆出来的结果会有大量空行和残缺值。

第四步,看是否要保留原列。拆分的时候PowerQuery默认保留原列,你也可以选择不保留。逆透视的时候则要考虑哪些列要作为属性、哪些列要作为值,还有没有需要保持原样的"上下文列"。

这个自查过程看起来简单,但能帮你省下大量反工时间。我见过太多人上来就点"逆透视列",结果发现数据里根本不存在需要逆透视的结构,纯粹是因为听说这个功能很常用;也见过有人对一个包含多个值的单元格反复用"替换值"手工清理,却不知道直接拆分行就能解决。

3. 核心实操:按分隔符分列与分行的完整步骤

3.1 打开拆分对话框,看懂三个关键选项

当你选中目标列后,点击"拆分列",下拉菜单里会有"按分隔符""按字符数""按大写和小写字符之间的转换""按非数字到数字的转换"等选项。

日常用得最多的是"按分隔符"。点击后弹出对话框,你有三个关键选项需要理解:

第一个是"选择或输入分隔符"。下拉框里预置了逗号、分号、制表符、空格、自定义等。这里有个细节:PowerQuery里的"逗号"默认匹配的是英文逗号,如果你数据里用的是中文全角逗号,拉到底部选"自定义",然后手动输入中文逗号,又或者直接用"插入特殊字符"来指定。

第二个是"拆分为"——这是分列和分行的分水岭。选择"列"就是按列分列,选择"行"就是按列分行。这个位置藏得很深,很多新手在这里点错,导致后续整个数据形态完全不对。

第三个是"高级选项"里的"拆分为多个列"。比如一列地址拆分成"省市区县",分隔符相同,如果每个单元格里的省市区段数一致,可以用"按最多列数拆分"来保证统一结构。如果各单元格的段数不一致,建议用"按分隔符拆分到尽可能多的列",让系统自动按最多段数的行决定列数。

3.2 按列分列实操:订单渠道拆列场景演示

现在用一个实际案例走一遍完整流程。

假设你拿到一张订单表,里面有一列"渠道":

订单ID渠道金额
A001线上-自营199
A002线下-分销350

任务要求:把"渠道"列拆成两列,一列是"销售场景",一列是"销售方式"。

操作步骤:

选中"渠道"列,点击"拆分列 -> 按分隔符",分隔符选择自定义,输入"-",拆分为选择"列",高级选项里按"尽可能多的列"拆分,点击确定。PowerQuery会生成两个新列,默认命名是"渠道.1"和"渠道.2",系统还自动执行了一个"更改的类型"步骤。我一般会马上把新列重命名成"销售场景"和"销售方式",然后删掉原始"渠道"列。最后点击"关闭并应用",回到PowerBI报表界面。

这里要注意:PowerQuery默认使用"-"做分隔符时,如果有单元格里出现了多个"-",比如"线上-自营-会员日",拆出来的列会超过两列。所以如果你的业务里分隔符本身也可能出现在数据内容里,拆分前最好先确认数据里分隔符出现的次数规律。这一步可以用"分组依据"做一次统计,看看分隔符数量分布,再决定用固定列数还是尽可能多的列。

3.3 按列分行实操:商品明细拆行场景演示

继续用同一张订单表,把场景改一下。现在表里有"商品清单"列,一个订单里包含了多个商品ID和商品数量。

订单ID商品清单金额
A001P001 x1, P002 x2299
A002P003 x1150

这个数据里,"商品清单"是由逗号连接的多个商品片段,每个片段里又有"商品ID"和"数量"两层信息。如果我们要做"每个订单对应每个商品"的明细分析,就需要先按逗号拆分成行,得到每个商品的独立一行,然后再继续处理。

操作步骤:选中"商品清单"列,点击"拆分列 -> 按分隔符",分隔符选择逗号,拆分为选择"行",点击确定。

此时系统会变成这样:

订单ID商品清单金额
A001P001 x1299
A001P002 x2299
A002P003 x1150

原始订单的金额被自动复制到了每一行,这就是"拆分行"和"分列"最大的行为差异:分列不增加行数,分行会让一行变成多行,其他列的值自动重复填充。

到这一步还没结束。因为"P001 x1"这个片段里还包含着"商品ID"和"数量"两层信息,需要再做一次"拆分列",用空格作为分隔符,再拆成两列。整个过程就是分列和分行交替使用,非常典型的处理链路。

3.4 逆透视列实操:季度汇总宽表转长表

再看宽表转长表的场景。

门店一季度二季度三季度四季度
上海店10012090110
北京店13095105120

要在PowerBI里画一条按季度的趋势折线图,这个表是不行的。季度应该在横轴上,所以必须把四个季度的列变成一行一行的数据。

操作步骤:在PowerQuery里选中"门店"列,点击"转换 -> 逆透视其他列"。这里我建议你用"逆透视其他列"而不是"逆透视列",因为前者不需要手动勾选所有季度列,你只需要选中那些需要保留原样的"上下文列"(这里就是门店),其他列自动变成属性值对。

点击之后,PowerQuery会生成两列,默认叫"属性"和"值"。"属性"列里存的是原来那些列名(一季度、二季度等),"值"列里存的是数值。

然后还有一些细节要处理。把"属性"列里的"季度"两个字去掉,让它变成纯数字,方便后续按季度排序。方法是用"替换值",把"季度"替换成空。再把"值"列的数据类型改成整数。改完之后,这张表就可以直接用来生成趋势折线图,或者拖进"矩阵"可视化做交叉分析。

逆透视列为什么会这么重要?因为PowerBI的很多可视化控件要求数据是"长表"结构——一个维度列用来做轴,一个度量列用来做值。业务系统导出的数据却常常是"宽表",列名就是维度值。逆透视就是打通这两者之间的桥。

4. 进阶场景:多级拆分、智能拆分与自定义列

4.1 一次拆分不干净时的多级处理链路

实际业务中,遇到的数据往往比刚才演示的例子复杂得多。常见的一种情况是:一个单元格里既有多个字段,又有多个记录。比如:

员工ID名下项目
E001项目A/开发;项目B/测试;项目C/运维

这里"项目A/开发"是一个项目记录,里面包含"项目名"和"担任角色"两个字段;记录之间用分号隔开。处理链路是:先用分号按"拆分行",把三个项目变成三行,再用"/"按"拆分列",把项目名和角色拆开。这样的多级处理在PowerQuery里没有任何问题,因为每一步操作都会被记录下来,你随时可以插入中间步骤。

但这里有一个必须留意的点:多级拆分后,一定要重新审查每一列的数据类型。尤其当你拆出来的片段里包含数字编号,比如"P001", PowerQuery有时会自作主张转换成数字1,导致原始编号丢失。预防方式是:在拆分之后,马上检查"更改的类型"步骤,或者干脆在拆分之前就把整列的数据类型设为"文本",避免自动类型转换。

4.2 中文数字混合内容的"按字符数"拆分

还有一种不依赖分隔符的场景。信息片段之间没有逗号,但有固定长度。比如"月报表202401销售数据",你要把中间的"202401"年份月份字段单独取出来。这种时候,"按字符数拆分"就有用了。选中列后,拆分列 -> 按字符数,输入起始位置和长度,就能把固定位置的值切出来。

实际项目里另一种常见场景是身份证号、银行卡号等固定长度编码的拆分。但我不建议用固定字符数去拆这种字段,因为一旦数据源格式有微调,整个拆分就废了。更稳妥的办法是用"从示例中添加列"或者写M公式提取指定模式。PowerQuery里有个功能叫"从示例中添加列",你只需要给一两个例子告诉它"我要取第7到14位"或者"我要取前6位",它会自动帮你推断规则。这个功能在"添加列"选项卡下,用起来非常顺手,尤其适合处理不规则文本。

4.3 自定义分隔符陷阱:多个分隔符并存

讲一个真实踩坑案例。有次我处理一个渠道平台的导出数据,里面的"用户标签"字段是这么存的:

用户ID用户标签
U001高价值,新品偏好, 活跃用户
U002低价值;沉默用户

同一个字段里既有中文逗号,又有英文逗号,还有分号。我直接选择分号做分隔符,结果那些用中文逗号连接的值根本没被拆分,数据行数少了一半。

解决方案是在拆分前做一步"清洗分隔符"。用"替换值"功能,先把所有中文逗号替换成英文逗号,再把所有分号也替换成英文逗号。这样整个字段的分隔符就统一了,之后无论拆行还是拆列,一步到位。

这个坑非常典型,几乎隔一段时间就会遇到一次。所以我的建议是:凡是遇到手动录入的数据(Excel表格、CRM系统、后台管理系统导出的数据),第一步不是急着拆分,而是先检查这个字段里到底存在多少种不同的分隔符。可以用"筛选器"查看这个列里唯一值的分布,也可以用"分组依据"统计包含特定字符的行数,几分钟就能摸清规律。

5. 常见问题与排查技巧实录

5.1 分列后列数不一致、错位怎么办

这是按列分列最常遇到的问题。同一个字段A行有3个片段,B行有5个片段,用"尽可能多的列"拆分后,B行多出来的列有值,A行对应的列就是null。如果后续用这些列做计算,null会造成数据缺失,视觉上报表里也会出现大片空白。

我的处理经验是:拆分之前先用分隔符计数。假设分隔符是逗号,你可以添加一个自定义列,用"Text.Length"函数计算每行逗号的数量,再按"分组依据"看最大值和分布。如果发现数量差异很大,就要考虑是不是数据录入不规范,或者分隔符本身在内容里出现过。如果确认数据本身没问题,只是列数不一致,可以在拆分后用"填充"功能,或者用"合并列"重新组合某些字段,保证结构统一。

5.2 空值和空格带来的坑

按列分列时,PowerQuery遇到连续两个分隔符(比如"项目A,,项目B"),默认会产出一个空值行。在拆分行的时候,这会直接产生一行全部为空的数据,污染后续计算。

最稳妥的清理办法是:拆分之后立即加一步"筛选行",筛选条件设为"拆出的列不等于null且不等于空字符串"。如果你不需要保留空记录,这一步不要省略。还有一个小细节:从Excel导入的空白单元格在PowerQuery里会显示为null,而从CSV导入的可能显示为空字符串,这两种都要清理,方法不同。null可以用"替换值"替换成统一标记,空字符串则要"替换值"把""替换掉。实战中建议把这两步合并处理,防止后面做数据建模时因为null报错。

5.3 数据类型自动转换导致的编号丢失

PowerQuery默认会在很多操作之后自动执行一次"更改的类型"。比如你把"P001,P002"拆成行后,系统默认把结果列设为文本,但如果拆出来的纯粹是数字,可能会被转成整数类型。这看起来人畜无害,其实坑在后续。举个例子,你把"001"拆出来了,类型被改成整数,变成"1","02"变成"2"。等你回头发现再想改回文本,已经丢了前导零,原始编号彻底找不回来了。

所以处理编码型数据,我建议你在拆分操作后马上检查查询设置里的步骤,看到"更改的类型"这个步骤,如果里面出现了可疑的整数转换,直接删掉这个步骤,或者手动把列类型改回文本。当然更治本的方法是:在数据源导入阶段就声明好哪些列是文本列,用"选择列"或"更改类型"把整列设为文本,这样后续所有操作都会保留前导零。

5.4 大数据量拆分性能变慢怎么办

PowerQuery处理几千行数据通常很快,但当你处理几十万行、且每行都要拆分成几十行时,查询会明显变慢。很多人以为是电脑配置不行,其实很多时候是操作步骤顺序的问题。

我见过一个典型案例:一张20万行的订单表,用户先用"展开"功能处理嵌套表,产生了几百万行数据,才发现需要拆分,于是又加了一步拆分行。PowerQuery每步操作都会重放全部上游数据,所以惩罚不是线性增长的。这种情况下,我建议尽量在数据导入早期就完成拆分,不要等到后面做了大量合并、筛选再拆。另一个办法是拆分前先用"删除其他列"把无关列去掉,减小数据宽度,PowerQuery处理行的速度会明显提升。

如果实在慢,还有一个备用方案:把拆分逻辑放到SQL端。如果数据源是数据库,直接写个字符串拆分查询,或者用数据库自带的Split函数,效率比PowerQuery高一大截。PowerQuery在ETL流程里定位是"清洗和转换",不适合做超大数据的逐行字符串操作。

6. 我自己一直在用的三个实操习惯

分享几个每次处理分列分行任务时都会主动做的事。第一,每做一步拆分,就在查询设置里给步骤重命名,比如把"已拆分列-按分隔符"改成"拆分商品清单"或者"按逗号拆用户标签"。别小看这个动作,PowerQuery查询多了以后,步骤名混乱是排查问题最大的绊脚石。第二,拆分前一定备份原始列,或者至少不要急着删除原列。有时候拆完发现分隔符判断错了,原列还在的话,只需删掉拆分步骤重新来,原列删了就得重新加载数据源。第三,所有拆分操作做完之后,用"数据视图"或者"按列统计信息"检查一下每一列的最大值、最小值、空值数量,这个习惯能帮你发现很多隐藏在拆分行里的异常数据。

按列分行和按列分列之所以值得单独写一篇,是因为它们是PowerQuery数据整理里最常用、也最容易被误用的核心操作。理解两者的本质区别,熟悉完整操作链路,再把本文提到的坑都提前规避掉,处理绝大多数表格重新结构的需求就不会再手忙脚乱了。这套能力练熟之后,你会发现PowerBI最花时间的往往不是做可视化,而是把数据整理到能用的状态,而PowerQuery正是解决这个问题的关键工具。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询