2.2.1工具篇-Power Query——Power Query从入门到精通 “我花了80%的时间清洗数据只有20%的时间分析数据。”——这曾是数据分析师的日常写照。直到Power Query的出现彻底改变了这一工作模式。一、为什么Power Query是数据分析必备技能在正式开始学习之前让我们先了解Power Query为什么值得你投入时间学习。1.1 数据准备的现实挑战在日常数据分析工作中我们几乎从未遇到过完美数据。典型的数据挑战包括多源数据数据分散在Excel、CSV、数据库、Web API等不同来源脏数据问题包含空白值、错误值、重复值和不一致格式结构问题需要将宽表转换为长表或者合并多个相关表格重复劳动每月、每周甚至每天都需要执行相同的数据清洗步骤1.2 Power Query的解决方案Power Query是微软推出的数据连接和数据准备技术它通过以下方式解决上述问题可视化操作无需编写复杂代码通过点击界面完成复杂转换可重复流程一次构建数据处理流程可随时刷新应用于新数据强大集成深度集成于Excel和Power BI学习一次多处应用性能优化可处理百万行级别数据远超传统Excel公式能力二、Power Query界面全解析让我们先熟悉Power Query的编辑环境这是后续所有操作的基础。2.1 打开Power Query编辑器在Excel中选择数据选项卡点击获取数据选择数据源如从工作簿选择具体文件和数据表点击转换数据打开Power Query编辑器2.2 编辑器界面组成Power Query编辑器分为以下几个关键区域功能区包含所有数据转换命令的上方菜单栏查询列表左侧显示当前工作簿中的所有查询数据预览中央区域显示当前查询的数据预览属性面板右侧显示查询属性和应用步骤公式栏可选显示展示当前步骤的M代码三、从实战开始销售数据分析案例让我们通过一个实际案例逐步掌握Power Query的核心功能。3.1 案例背景假设你是一家零售公司的数据分析师收到了一份销售数据存在以下问题数据分布在多个工作表中日期格式不一致有的为2023-01-01有的为2023年1月1日产品价格包含货币符号如100存在空白行和测试数据需要计算每个订单的总金额3.2 数据获取与初步处理步骤1连接数据源在Excel中点击数据 “获取数据” “从文件” “从工作簿”选择你的Excel文件在导航器中选择需要的工作表点击转换数据而不是加载步骤2提升标题经常数据的第一行是列名但Power Query可能将其识别为数据。解决方法在编辑器中选择转换选项卡点击将第一行用作标题步骤3更改数据类型正确的数据类型至关重要点击列标题旁边的数据类型图标选择合适的数据类型文本、整数、小数、日期等或者选择多列右键选择更改类型// 对应的M语言代码 Table.TransformColumnTypes(源,{{OrderID, Int64.Type}, {OrderDate, type date}})3.3 高级数据清洗技巧处理日期格式不一致选择日期列右键单击选择更改类型 “使用区域设置”选择日期类型和适当的区域设置如中文(中国)提取和转换文本值对于包含100的价格列选择该列点击转换选项卡 “提取” “文本之前的分隔符”输入分隔符将结果列更改为小数类型// 提取数字值的M代码 Table.TransformColumns(已更改的类型, {{Price, each Text.AfterDelimiter(_, ), type number}})填充向下和向上处理空白单元格选择有空白值的列点击转换 “填充” “向下或向上”这将用上面或下面的值填充空白条件列实现复杂逻辑添加一列标识大额订单点击添加列 “条件列”设置条件如果销售额大于1000则大额否则正常或者使用自定义公式模式// 条件列的M代码 Table.AddColumn(已更改的类型, OrderSize, each if [Sales] 1000 then Large else Normal)3.4 数据整合与转换合并多个查询当数据分布在多个工作表时首先为每个工作表创建独立查询确保所有查询结构相同列名和数据类型一致新建一个空白查询使用Table.Combine({查询1, 查询2})函数合并逆透视从宽表到长表这是Power Query中最强大且难以理解的功能之一选择需要保持不变的列如ID、日期等按住Ctrl选择需要逆透视的多个列右键单击选择逆透视列结果将生成两个新列“属性”原列名和值原单元格值// 逆透视的M代码 Table.UnpivotOtherColumns(已更改的类型, {ID, Date}, Attribute, Value)分组与聚合像SQL的GROUP BY一样工作选择转换选项卡 “分组依据”选择要分组的列如产品类别添加新列名和聚合操作如总销售额求和// 分组聚合的M代码 Table.Group(已更改的类型, {Category}, {{TotalSales, each List.Sum([Sales]), type number}})四、重点实战读取多个文件的高级技巧在实际工作中我们经常需要处理分布在多个文件中的数据。以下是两种最常见场景的详细解决方案。4.1 读取包含多个Excel文件的文件夹这是处理月度报表、分部门数据等场景的必备技能。操作步骤准备文件确保所有Excel文件放在同一文件夹中且结构相同列名和顺序一致获取数据在Excel中数据 → 获取数据 → 从文件 → 从文件夹选择包含所有Excel文件的文件夹路径组合文件点击组合按钮旁边的下拉箭头选择合并和转换数据选择示例文件Power Query会提示选择一个文件作为示例选择工作表在导航器中选择正确的工作表调整参数可选可以设置是否包含文件名作为新列可以设置是否包含文件路径信息// 读取多个Excel文件的完整M代码 let Source Folder.Files(C:\你的文件夹路径), FilteredHiddenFiles Table.SelectRows(Source, each [Attributes]?[Hidden]? true), ExcelFiles Table.SelectRows(FilteredHiddenFiles, each Text.Lower([Extension]) .xlsx), ImportExcel Table.AddColumn(ExcelFiles, ExcelData, each Excel.Workbook([Content], true)), ExpandedData Table.ExpandTableColumn(ImportExcel, ExcelData, {Name, Data, Item, Kind, Hidden}, {WorkbookName, Data, Item, Kind, Hidden}), FilterSheets Table.SelectRows(ExpandedData, each [Kind] Sheet), SelectData Table.SelectColumns(FilterSheets,{Name, WorkbookName, Data}), ExpandData Table.ExpandTableColumn(SelectData, Data, Table.ColumnNames(SelectData[Data]{0})), SetTypes Table.TransformColumnTypes(ExpandData,{{Sales, type number}, {Date, type date}}) in SetTypes重要注意事项所有Excel文件的结构必须相同列名和顺序文件扩展名可以是.xlsx或.xls需要在代码中相应调整使用Excel.Workbook([Content], true)中的第二个参数true表示第一行包含标题最后结果只会留有一行标题4.2 读取包含多个CSV文件的文件夹处理日志文件、传感器数据、导出数据等场景非常常见。操作步骤准备文件确保所有CSV文件在同一文件夹使用相同的分隔符和编码获取数据数据 → 获取数据 → 从文件 → 从文件夹选择包含CSV文件的文件夹组合文件点击组合按钮 → “合并和加载”或者选择合并和转换数据进行进一步处理配置CSV导入选项可以指定分隔符逗号、分号、制表符等可以设置编码格式UTF-8、ANSI等可以处理包含标题行的情况// 读取多个CSV文件的完整M代码 let Source Folder.Files(C:\你的CSV文件夹路径), CsvFiles Table.SelectRows(Source, each Text.Lower([Extension]) .csv), ImportCsv Table.AddColumn(CsvFiles, CsvData, each Csv.Document([Content], [Delimiter,, EncodingTextEncoding.Utf8, QuoteStyleQuoteStyle.Csv])), ExpandedData Table.ExpandTableColumn(ImportCsv, CsvData, Table.ColumnNames(ImportCsv[CsvData]{0})), PromoteHeaders Table.PromoteHeaders(ExpandedData, [PromoteAllScalarstrue]), SetTypes Table.TransformColumnTypes(PromoteHeaders, {{Date, type date}, {Amount, type number}, {ProductID, type text}}), AddFileName Table.AddColumn(SetTypes, FileName, each [Name]) in AddFileName高级配置选项// CSV导入的详细参数配置 Csv.Document( contents, [ Delimiter,, // 分隔符,, ;, \t等 Columns5, // 指定列数可选 EncodingTextEncoding.Utf8, // 编码格式 QuoteStyleQuoteStyle.Csv, // 引号处理方式 ExtraValuesExtraValues.Ignore // 处理额外值的方式 ] )4.3 处理常见问题与错误问题1文件结构不一致解决方案先统一文件结构或使用try表达式处理异常// 使用try处理可能缺失的列 Table.AddColumn(Source, CustomColumn, each try [ExistingColumn] otherwise try [AlternativeColumn] otherwise Default Value)问题2文件编码问题解决方案指定正确的编码格式// 尝试不同编码格式 Table.AddColumn(Source, Data, each try Csv.Document([Content], EncodingTextEncoding.Utf8) otherwise try Csv.Document([Content], EncodingTextEncoding.Windows) otherwise error 无法解析文件)问题3性能优化解决方案尽早筛选和删除不必要的列// 优化性能的最佳实践 let Source Folder.Files(C:\路径), FilterFiles Table.SelectRows(Source, each [Extension] .csv), // 尽早筛选 Import Table.AddColumn(FilterFiles, Data, each Csv.Document([Content])), RemoveColumns Table.SelectColumns(Import,{Data}), // 删除不必要的列 Expand Table.ExpandTableColumn(RemoveColumns, Data, {Column1, Column2}), // 只扩展需要的列 FilterRows Table.SelectRows(Expand, each [Column1] null) // 筛选行 in FilterRows五、M语言入门超越界面操作虽然Power Query提供了可视化界面但了解背后的M语言能让你突破界面限制。5.1 M语言基础概念M语言是Power Query使用的函数式语言基本结构如下let 步骤1 表达式1, 步骤2 表达式2, ... 最终步骤 表达式N in 最终步骤5.2 常用M函数示例文本处理函数// 合并文本 Text.Combine({Hello, World}, ) // 返回 Hello World // 提取子文本 Text.Range(PowerQuery, 5, 5) // 返回 Query // 替换文本 Text.Replace(2023年01月, 年, -) // 返回 2023-01月日期与时间函数// 获取当前日期 DateTime.LocalNow() // 提取日期部分 DateTime.Date(DateTime.LocalNow()) // 计算日期差 Duration.Days(#date(2023,12,31) - #date(2023,1,1)) // 返回 364列表与表操作// 创建列表 {1, 2, 3, 4, 5} // 列表转换 List.Transform({1, 2, 3, 4, 5}, each _ * 2) // 返回 {2, 4, 6, 8, 10} // 筛选表 Table.SelectRows(源, each [Sales] 1000)六、高级技巧与最佳实践6.1 参数化查询创建可重复使用的参数使查询更加灵活在Power Query编辑器中点击管理参数 “新建参数”设置参数名称、类型和默认值在查询中引用参数如筛选日期大于参数值// 引用参数的示例 Table.SelectRows(源, each [OrderDate] #date(ParameterYear, ParameterMonth, ParameterDay))6.2 错误处理确保查询不会因为个别错误值而中断// 使用try表达式处理错误 Table.AddColumn(源, SafeDivision, each try [Numerator] / [Denominator] otherwise 0)6.3 性能优化技巧尽早筛选在流程开始时使用Table.SelectRows筛选掉不需要的行选择必要列使用Table.SelectColumns移除不需要的列避免重复计算合理安排步骤顺序减少中间计算查询折叠当连接数据库时确保操作能下推到数据库执行七、Power Query在Power BI中的进阶应用在Power BI中Power Query的能力得到进一步扩展7.1 直接连接企业数据库支持SQL Server、Oracle、MySQL等主流数据库可编写原生SQL查询或使用可视化查询生成器支持参数化数据库查询7.2 更强大的数据处理能力处理更大数据量百万行以上支持直接调用R和Python脚本进行高级转换与Dataflows集成实现企业级数据准备工作流7.3 与数据模型深度集成清洗后的数据可直接加载到数据模型支持创建层次结构、计算列和度量值为后续的DAX分析和可视化奠定基础八、学习路径与资源推荐8.1 循序渐进的学习路径初级阶段1-2周掌握基本界面操作和常用转换数据获取与基本清洗数据类型转换与错误处理添加列与条件列中级阶段2-4周掌握数据整合与高级转换合并与追加查询逆透视与分组参数化查询高级阶段1-2月掌握M语言与性能优化M语言核心语法自定义函数编写查询性能分析与优化8.2 推荐学习资源官方文档Power Query文档M语言参考专业书籍《M is for Data Monkey》《Power Query权威指南》在线课程微软官方学习路径社区支持Power BI社区、Stack Overflow的Power Query标签结语从数据清洗工到数据分析师Power Query不仅仅是一个工具它代表了一种思维方式的转变——从手动、重复的数据准备工作中解放出来将更多时间投入到真正的数据分析和洞察发现中。通过本文学到的技能你可以将数据准备时间从几小时缩短到几分钟构建可重复使用的数据流程一劳永逸处理更复杂、更庞大的数据集为高级分析和可视化奠定坚实基础记住 mastery精通来自于practice实践。选择你当前的数据挑战开始应用Power Query解决它吧