Power Query 系列 (01) - Power Query 介绍

Power Query 介绍

Power Query 是微软提供的工具,Excel 2013 版作为插件加载使用,从 Office 2016 版开始,Power Query 的功能集成到 Excel 中,可以直接使用。微软推出 Power BI Desktop 后,一系列的工具,比如 Power Query, Power Pivot, Power View 等,都集成在其中。Power Query 定位查询,中文一般翻译为超级查询,主要作用是连接不同种类的数据源,进行数据的转换。下图来自微软官方对 Power Query 的介绍,可以帮助理解。Power Query 主要实现连接转换功能。

Power Query 是一种数据连接技术,可用于发现、连接、合并和优化数据源以满足分析需要。 Power Query 的功能在 Excel 和 Power BI Desktop 中可用。


网上关于 Power Query 以及 Power Query 内置的 M 语言的教程并不多,所以计划撰写系列博客,尽量以案例的方式,讲解 Power Query 和 M 语言 (M 语言后被改名为 Power Query Query Language)的使用方法。本文先从一个例子,说明 Power Query 的典型步骤和 Power Query 主要构成。

Power Query 实现工作表汇总

给出一个在 Excel 中处理有点难度的东西:工作表数据合并,如下图所示:

如果只有几个 Excel 工作表,可以用拷贝和粘贴来解决。如果是多个 Excel 工作表呢?我特意在网上搜索了一下,知乎上有两篇文章,一篇是基于 VBA 的,另一篇是基于数据透视表多重合并计算区域的。

VBA 对于普通 Excel 用户来说,掌握的人并不多。有了 Power Query 之后呢,合并工作表就变得轻而易举了。大家先跟着我做,刚开始不理解的地方也暂时放过,后面随着理解的加深,很多细节就由熟悉变成轻松驾驭了。

打开一个新的 Excel 工作簿,切换到【数据】页面,然后通过菜单【获取数据】- 【来自文件】- 【从工作簿】,找到数据源的 Excel 工作簿。

点击【导入】按钮,因为 Excel 工作簿有多个工作表,我们先选择其中一个,比如 Jan 工作表进行导入。后面解释原因。

现在 Sheet1 中可以看到一月份的数据,并且右边多了一个 查询和连接 面板。在这个面板中,有一个名为 Jan 的查询,双击这个查询,进入 Power Query 编辑器 界面。

通过这个界面,我来解释一下 Power Query 的主要构成要素:

左边是查询,现在有一个查询,查询名为 Jan

右边是步骤。查询由步骤组成。我们可以试着用鼠标依次点击每一个步骤,这时可以发现,中间的显示区数据会跟着变化。比如当我们点击第一步:源,显示区的显示如下:

我们看到,这一步骤中,Power Query 读取 sales.xlsx 文件,识别出工作部有三个工作表。工作表的名称分别为 Jan, Feb 和 Mar,这三个工作表的内容(Data) 字段为 Table 类型数据 (Table 是 Power Query 三大容器类型的数据类型之一)。我们可以点击任意一行的 Data 字段,显示区的下方相应显示 Table 的内容。

点击第二个步骤,显示区显示如下:

可以看出,根据我们刚开始的选择,Power Query 选择了 Jan 这个工作表。第三个步骤,Power Query 将第一行作为列名,第四个步骤,Power Query 尝试帮我们确定每一列的数据类型。

从这里可以看出,Power Query 将我们数据处理过程中的步骤都记录下来了,并且在每一步,都能够可视化查看数据的变化,而这一切都是基于 M 语言的。在主页视图两个选项卡都有高级编辑器按钮,点击后进行 M 语言代码的查看和编辑界面:

现在看来可能比较懵,后面我们要对 M 语言进行剖析,大家可以跟着我来一起学习。

再回到操作步骤,点击步骤前面的删除图标,删除除之外的所有步骤:

这个时候的界面应该是下面这个样子:

在显示区中,删除除 Data 外所有列,删除后显示区的界面如下:

注意到 Data 列右边下图所示的图标了吗?这个图标表示的操作叫做“展开”,可以对 Table 的内容展开到明细。

展开操作动图:

后面还需要两个步骤的操作:将第一行作为标题:


另外,多个 Sheet 的表头都作加载到行中,行数据可以使用筛选功能将不需要的表头筛选掉:

完成这些操作后,主页页签中“关闭并上载”,处理的结果即可以上载到 Excel 工作表,这是结果数据。如果源数据有变化,比如某一条记录发生变化,新增一个工作表,都可以通过刷新按钮更新数据。

以下是 M 语言脚本:

let
    源 = Excel.Workbook(File.Contents("C:\Users\StoneWM\Desktop\monthly-sales\sales.xlsx"), null, true),
    删除的列 = Table.RemoveColumns(源,{"Name", "Item", "Kind", "Hidden"}),
    #"展开的“Data”" = Table.ExpandTableColumn(删除的列, "Data", {"Column1", "Column2", "Column3", "Column4"}, {"Column1", "Column2", "Column3", "Column4"}),
    筛选的行 = Table.SelectRows(#"展开的“Data”", each true),
    提升的标题 = Table.PromoteHeaders(筛选的行, [PromoteAllScalars=true]),
    更改的类型 = Table.TransformColumnTypes(提升的标题,{{"Month", type text}, {"Name", type text}, {"Product", type text}, {"Sales", type any}}),
    筛选的行1 = Table.SelectRows(更改的类型, each ([Month] <> "Month"))
in
    筛选的行1

最后,我们总结一下对 Power Query 的初步印象:Power Query 的核心是查询对象,通过查询对象连接不同的数据源获取数据,并对数据进行处理和转换,得到处理后的结果。处理过程的每一个步骤都通过 M 语言脚本被记录下来,从而实现处理过程自动化。

参考

示例素材

github

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343