当前位置: 首页 > news >正文

第14篇:Power Query 高级数据处理

第14篇:Power Query 高级数据处理

1. Power Query 核心概念

1.1 M 语言基础

Power Query 使用 M 语言进行数据转换:

// 基本语法结构 let 步骤1 = 操作1, 步骤2 = 操作2, 结果 = 最终输出 in 结果

1.2 查询步骤链

源数据 ↓ 引用类型转换 ↓ 删除列 ↓ 筛选行 ↓ 分组聚合 ↓ 合并查询 ↓ 输出结果

2. 高级数据获取

2.1 多文件合并

场景:合并文件夹中的多个 Excel 文件

let 源 = Folder.Files("C:\Data\Sales"), 筛选Excel = Table.SelectRows(源, each [Extension] = ".xlsx"), 添加内容 = Table.AddColumn(筛选Excel, "Content", each Excel.Workbook([Content])), 展开内容 = Table.ExpandTableColumn(添加内容, "Content", {"Data", "Item"}), 展开数据 = Table.ExpandTableColumn(展开内容, "Data", {"日期", "产品", "金额"}) in 展开数据

2.2 动态数据源

使用参数化数据源:

let 服务器名 = Parameter 服务器名称, 数据库名 = Parameter 数据库名称, 连接字 = "Provider=SQLNCLI11;Server=" & 服务器名 & ";Database=" & 数据库名, 数据 = Sql.Database(服务器名, 数据库名) in 数据

2.3 Web API 调用

let URL = "https://api.example.com/data", 请求头 = [#"Authorization" = "Bearer your-token"], 响应 = Json.Document(Web.Contents(URL, [Headers = 请求头])), 转表 = Table.FromRecords(响应[data]) in 转表

3. 复杂数据清洗

3.1 文本处理

// 提取数字 提取金额 = Table.AddColumn(源, "金额", each Number.From(Text.Select([描述], {"0".."9", "."}))) // 分割列 分割姓名 = Table.SplitColumn(源, "姓名", Splitter.SplitTextByDelimiter(" "), {"姓", "名"}) // 正则替换(需调用 Python) // 建议在 Power Query 中用基础函数替代 清理文本 = Table.TransformColumns(源, {"字段", each Text.Clean(Text.Trim(_))})

3.2 日期处理

// 从文本解析日期 解析日期 = Table.TransformColumns(源, {"日期列", each Date.FromText(_, "zh-CN")) // 提取日期部分 添加年月 = Table.AddColumn(源, "年月", each Date.ToText([日期], "yyyy-MM")) // 计算工作日 工作日判断 = Table.AddColumn(源, "是否工作日", each List.Contains({1..5}, Date.DayOfWeek([日期], Day.Monday) + 1))

3.3 数据类型推断

// 批量类型转换 类型转换 = Table.TransformColumnTypes( 源, { {"日期", type date}, {"金额", type number}, {"数量", Int64.Type} }, "zh-CN" )

4. 高级合并与连接

4.1 多表合并

let 表1 = Excel.Workbook(File.Contents("销售.xlsx")){[Item="销售"]}[Data], 表2 = Excel.Workbook(File.Contents("订单.xlsx")){[Item="订单"]}[Data], 合并表 = Table.Combine({表1, 表2}) in 合并表

4.2 条件合并

// 左反连接(仅左表独有) 左反 = Table.NestedJoin( 表1, {"ID"}, 表2, {"ID"}, "合并", JoinKind.LeftAnti ) // 完全外连接 全外 = Table.NestedJoin( 表1, {"ID"}, 表2, {"ID"}, "合并", JoinKind.FullOuter )

4.3 模糊匹配

模糊匹配 = Table.FuzzyNestedJoin( 表1, {"姓名"}, 表2, {"姓名"}, "匹配结果", JoinKind.LeftJoin, [IgnoreCase=true, IgnoreSpace=true] )

5. 数据透视与逆透视

5.1 透视列

将行值转为列:

透视结果 = Table.Pivot( 源, List.Distinct(源[月份]), "月份", "销售额", List.Sum )

转换前:

产品月份销售额
A1月100
A2月150
B1月200

转换后:

产品1月2月
A100150
B200null

5.2 逆透视列

将列转为行值:

逆透视 = Table.Unpivot( 源, {"1月", "2月", "3月"}, "月份", "销售额" )

6. 自定义函数

6.1 创建函数

// 函数:计算税后价格 税后价格 = (价格 as number, 税率 as number) as number => let 结果 = 价格 * (1 + 税率) in 结果 // 使用函数 添加税后 = Table.AddColumn(源, "税后价", each 税后价格([单价], 0.13))

6.2 递归函数

// 计算阶乘 阶乘 = (n as number) as number => if n <= 1 then 1 else n * @阶乘(n - 1)

6.3 参数化函数

// 动态数据获取 获取数据 = (服务器 as text, 数据库 as text, 表名 as text) => let 结果 = Sql.Database(服务器, 数据库){[Schema="dbo", Item=表名]}[Data] in 结果

7. 高级分组聚合

7.1 多级分组

多级分组 = Table.Group( 源, {"地区", "产品类别"}, { {"销售总额", each List.Sum([销售额])}, {"订单数量", each Table.RowCount(_)}, {"平均单价", each List.Average([单价])} } )

7.2 条件分组

条件分组 = Table.Group( 源, {"客户"}, { {"大订单数", each Table.RowCount(Table.SelectRows(_, (r) => r[金额] > 10000))}, {"小额订单总额", each List.Sum(List.Select([金额], (x) => x <= 1000))} } )

8. 错误处理

8.1 Try-Catch

安全转换 = Table.TransformColumns( 源, {"金额", each try Number.From(_) otherwise null} )

8.2 错误替换

替换错误 = Table.ReplaceErrorValues( 源, {{"金额", 0}, {"日期", null}} )

8.3 验证逻辑

验证数据 = Table.AddColumn( 源, "验证状态", each let 金额检查 = if [金额] >= 0 then "✓" else "✗", 日期检查 = if [日期] <= Date.From(DateTime.LocalNow()) then "✓" else "✗" in if 金额检查 = "✓" and 日期检查 = "✓" then "有效" else "无效" )

9. 性能优化

9.1 查询折叠

确保操作可推送至数据源:

支持折叠的操作: ✅ 筛选行 ✅ 选择列 ✅ 排序 ✅ 分组聚合 ✅ 合并(同源) 不支持折叠: ❌ 条件列(复杂逻辑) ❌ 自定义函数 ❌ 多数据源合并

9.2 禁用加载

查询设置 → 禁用: ✅ 仅作为数据源,不加载到模型

9.3 增量刷新

配置步骤: 1. 设置日期参数 2. 筛选最近数据 3. 发布到服务 4. 配置增量刷新策略

10. 最佳实践总结

✅ 使用参数化数据源 ✅ 批量处理而非逐行 ✅ 尽早筛选减少数据量 ✅ 保持查询折叠 ✅ 使用函数复用逻辑 ✅ 添加描述性步骤名 ✅ 处理错误和空值 ❌ 避免过度转换 ❌ 避免复杂计算列 ❌ 避免禁用折叠的操作 ❌ 避免引用完整表格 ❌ 避免硬编码值

11. 小结

本篇介绍了 Power Query 高级技术:

主题要点
数据获取多文件合并、动态源、API
数据清洗文本处理、日期解析、类型转换
合并连接多表合并、模糊匹配
透视逆透视列转行、行转列
自定义函数参数化、递归、复用
错误处理Try-Catch、验证逻辑
性能优化查询折叠、增量刷新

下一篇,我们将探讨企业级报表开发与最佳实践。

http://www.jsqmd.com/news/696547/

相关文章:

  • 终极指南:让Windows文件资源管理器完美显示iPhone HEIC照片缩略图
  • 华三交换机MSTP+VRRP配置
  • Phi-4-mini-flash-reasoning实操手册:health接口调用+服务状态自动化巡检脚本
  • 如何永久保存微信聊天记录?本地导出工具打造个人AI训练数据库终极方案
  • LFM2.5-VL-1.6B创意设计辅助:LOGO图理解+设计风格分析+改进建议生成
  • Hibernate和Mybatis 详细比较和全面总结
  • 2026年3月国内高压喷嘴生产商,雷达液位计/管道式超声波流量计/热式气体流量计/德尔塔巴流量计,高压喷嘴厂家如何选 - 品牌推荐师
  • LFM2.5-VL-1.6B效果展示:同一张复杂工程图的中/英/日三语种描述准确性对比
  • 1.1 VMware部署Rocky Linux 9 (GPT分区表,最小化安装)
  • LinkSwift网盘直链下载助手:彻底告别限速困扰的终极解决方案
  • 00华夏之光永存:华为黄大年茶思屋难题揭榜第15期(无线领域难题第一期)·题目篇
  • 2026Q2西南球墨铸铁管供应商排行及厂家地址盘点:给排水球墨铸铁管件/西南球磨铸铁管/防腐球墨铸铁管/DN100球墨铸铁管/选择指南 - 优质品牌商家
  • STM32的I2S时钟配置详解:如何为WM8978精准生成44.1kHz等音频采样率?
  • 2026年可靠回收公司选择指南:制冷设备回收/厂房回收/厂房设备回收/变压器回收/大型回收公司/学校桌椅回收/废旧设备回收/选择指南 - 优质品牌商家
  • 第15篇:企业级报表开发与最佳实践
  • 如何在3分钟内实现真正的P2P文件传输?QFT工具揭秘
  • 控制图中的过程稳定与异常检测
  • 信源、语义与基线——Infoseek舆情系统谈品牌声誉管理的三个监测盲区
  • unity 四元数的使用 与内部实现步骤原理 根是三角函数和基础数学 拼凑出来的
  • Flux2-Klein-9B-True-V2效果展示:星空银河系天体结构科学级渲染
  • 斑马文书AI PPT功能使用测评:AI一键生成PPT
  • 不平衡分类问题中ROC与PR曲线的应用与对比
  • Arm架构UMLSLL指令解析:高效矩阵运算优化
  • Z-Image-Turbo极速创作室全攻略:从部署到出图,一篇搞定
  • 【小白轻松解决】OpenClaw 2.6.4 连接 DeepSeek 模型完整教程(图文版)
  • GmSSL国密算法安全通信深度解析:TLCP与TLS 1.3架构设计与实现原理
  • 告别单一RGMII:在ZYNQ裸机下玩转PS+PL双网口设计的三种灵活架构
  • 软件语义搜索中的向量检索应用
  • LFM2.5-VL-1.6B快速上手:WebUI界面功能详解+快捷键操作指南
  • 【VSCode工业级调试适配指南】:20年嵌入式老兵亲授5大硬核配置技巧,让JTAG/SWD调试效率提升300%