初学者如何高效使用 Excel Power Query 清洗数据?
初学者可以先固定一套可重复刷新的清洗流程:整理数据源,明确字段类型,按业务规则筛选、去重,再将结果加载到 Excel。检查流程时,主要看源数据更新后能否稳定运行,以及清洗结果是否符合预期。
一、先把基础清洗流程固定下来
可以按下面的顺序开始,再根据数据调整:
- 整理数据源:尽量让数据只有一行表头,避免合并单元格,也不要在明细中夹入小计和说明文字。工作簿内的数据可以先用
Ctrl+T转为 Excel 表格。 - 保留需要的字段和记录:尽早删除确定用不到的列,筛掉明确不需要的行,减少后续处理的数据量。如果筛选依赖日期或数值比较,应先正确转换相关字段的类型。
- 检查数据类型:金额通常使用数值类型,日期使用日期类型,订单号、邮编等标识符通常使用文本类型。
- 清理字段内容:根据需要去除文本首尾空格,统一空值或分类名称。
- 按明确规则去重:先确定什么算重复,再选择用于判断重复的列。
- 检查结果并加载:核对行数、关键字段和必要的汇总值,然后加载到工作表或其他目标。
步骤顺序会影响结果。例如,客户名称存在首尾空格时,如果先去重再清理空格,可能留下清理后完全相同的记录。
二、查询怎样组织比较清楚?
简单任务用一个查询就够了。处理步骤变多、多个结果需要使用同一份数据时,可以将查询分为三层:
| 查询层次 | 示例名称 | 主要用途 |
|---|---|---|
| 数据源 | src_订单 | 连接数据源,完成必要的表头处理 |
| 清洗 | clean_订单 | 处理类型、空格、空值及重复项 |
| 输出 | out_月度销售 | 汇总并整理最终展示的字段 |
如果中间查询不需要显示在工作表中,可以设置为仅创建连接,减少工作表中的中间结果,方便维护。
需要从已有查询继续处理时,可以使用“引用”;需要一份以后独立修改的步骤副本时,可以使用“复制”。引用能减少重复维护,但不能因此认为刷新一定更快,或数据源一定只读取一次。
建议给关键步骤起能说明用途的名称,例如“清理客户空格”“保留有效订单”。如果筛选条件来自业务规则,也应添加简短说明,方便以后修改。
三、一个可以练习的清洗示例
假设当前工作簿中有一个名为 SalesData 的 Excel 表格,包含 订单号、客户、金额 三列。目标是去掉无订单号的记录、清理客户名称首尾空格,并删除这三列完全相同的重复行。
可以先通过界面逐步完成操作,再在高级编辑器中对照下面的 M 代码:
let
Source = Excel.CurrentWorkbook(){[Name="SalesData"]}[Content],
SelectedColumns = Table.SelectColumns(
Source,
{"订单号", "客户", "金额"}
),
TypedColumns = Table.TransformColumnTypes(
SelectedColumns,
{
{"订单号", type text},
{"客户", type text},
{"金额", type number}
}
),
TrimmedText = Table.TransformColumns(
TypedColumns,
{
{"订单号", each if _ = null then null else Text.Trim(_), type nullable text},
{"客户", each if _ = null then null else Text.Trim(_), type nullable text}
}
),
ValidOrders = Table.SelectRows(
TrimmedText,
each [订单号] <> null and [订单号] <> ""
),
RemovedDuplicates = Table.Distinct(ValidOrders)
in
RemovedDuplicates
使用时需要把表名和列名替换为自己的名称。示例假设金额能够正确转换为数值;如果转换报错,应先检查异常内容和区域设置。
这里的 Table.Distinct 按当前全部三列判断重复。订单号相同、金额不同的两行都会保留。如果业务要求每个订单号只保留一条记录,还需要明确保留规则,不能直接套用这个示例。
四、初学者容易踩哪些坑?
让自动类型识别决定所有字段类型
自动生成的“更改的类型”步骤需要检查。订单号即使全部由数字组成,也不一定适合转成数值。
如果前导零已经在源数据中丢失,之后改成文本也不会自动恢复。日期和带小数分隔符的文本可能受区域设置影响;遇到转换异常,可以使用“使用区域设置更改类型”,并选择与源数据匹配的设置。
直接删除所有错误行
错误可能意味着金额中混入了文字、日期格式不一致,或者源字段发生了变化。先查看错误记录,再决定修正、替换还是排除,避免把有效业务记录一起删掉。
null、空字符串 "" 和只包含空格的文本也应分别检查,不能假定它们完全相同。
去重前没有定义重复的含义
整行重复与订单号重复是两种规则。如果要求“每个订单保留最新一条”,应明确用于判断先后的日期或其他字段,以及时间相同时如何处理。不要依赖“先排序、再去重”来保证保留指定记录。
在加载结果里手动修数据
刷新可能覆盖对结果表的手工修改。需要长期保留的修正规则应写进查询;需要人工维护的对应关系可以放在独立映射表中,再合并到查询结果。
五、怎样让操作更快、更容易维护?
- 先用界面,再读 M 代码:每完成一个操作,查看对应步骤和公式,有助于理解转换逻辑。
- 集中处理相似操作:例如一次选择多列设置类型,减少重复点击。
- 先用少量数据调试:流程确认后再检查完整数据,尤其留意空值、错误和少见格式。
- 保留有意义的检查点:对比清洗前后的行数、唯一订单数或金额合计;存在差异时,应能解释原因。
- 用新增数据验证刷新:在源表中增加几行后刷新,确认新数据被包含,步骤也没有依赖固定行数。
刷新慢时,先找出耗时步骤,再考虑优化。排序、合并和分组等操作可能增加处理成本,具体影响取决于数据量、数据源和查询结构。初学者可以先把规则理清,保证结果正确、刷新稳定,再持续改进。
备注:内容仅供参考。
