第2章 Power BI数据准备:像高手一样处理数据
Power BI可以连接各种形式、各种来源的数据。无论是Excel、txt文件,还是各种数据库、云服务,甚至是网页数据,都可以被连接。
从各种来源获取的数据很可能不能直接用于数据分析,它们需要进行整理,这个整理的过程称为数据清洗。Power BI可以帮用户快速清洗数据,提升数据的可用性。
无论是数据获取还是数据清洗,Power BI都是通过内置的Power Query完成的。
Power Query是微软的数据连接和数据准备技术,它使用户能够无缝访问存储在数百个数据源中的数据,可以帮助用户精确地操控数据,对数据进行整理以适应各种需求。
本章内容不仅适用于Power BI中的Power Query,大部分内容同样适用于Excel中的Power Query。
2.1 认识Power Query
Power BI的数据处理是通过Power Query完成的,首先来看看如何进入Power Query。
在Power BI Desktop中,如果还没有任何数据,那么单击“获取数据”,选择相应的数据格式导入后,就可以进入Power Query编辑器,如图2-1-1所示。
图2-1-1 Power Query入口
如果已经导入数据,想再次进入查看或编辑,可以单击“转换数据”进入。进入后的界面如图2-1-2所示。
现在读者对这个界面可能还比较陌生,但通过之后的练习和使用,会逐渐熟悉它。
Power Query具有以下优势。
(1)操作简单:即使是初学者,无须掌握复杂的函数,仅使用界面上的功能即可完成大部分数据处理工作。
(2)数据量不限:突破传统Excel数据行的限制。
(3)自动化:处理过程全记录,每次数据源更新后刷新即可,无须重复操作。
接下来我们开始学习如何使用Power Query。
图2-1-2 Power Query编辑器
2.2 数据处理第一步:导入数据
既然要使用Power BI进行数据分析,那么第一步就是将数据导入到Power BI中。利用Power Query强大的数据处理功能,几乎可以从任何来源导入任何结构、任何形式的数据,具体可以导入的数据类型如图2-2-1所示。
图2-2-1 可以导入的数据类型
Power Query不仅支持微软的数据格式,比如Excel、SQL Server、Access等,还支持SAP、Oracle、MySQL、DB2等几乎所有类型的数据格式。
Power Query不仅能从本地获取数据,还能从网页抓取数据,比如实时抓取股票涨跌、外汇牌价等交易数据。现在我们尝试一下从中国银行网站上抓取外汇牌价信息。
单击“获取数据”,选择“Web”,在弹出的窗口中输入中国银行外汇牌价信息网址,如图2-2-2所示。
图2-2-2 从Web获取数据
单击“确定”后,出现预览窗口。在一个网页上,很可能不止一个数据表,如果出现多个,可以通过单击左侧的表格来预览,比如“表2”是我们需要获取的外汇牌价表,如图2-2-3所示。
图2-2-3 网页数据预览
单击“转换数据”,进入查询编辑器,完成数据获取,如图2-2-4所示。
通过以上步骤获取的这些数据是可以随时刷新的,以后不需要手动从网页上复制数据再粘贴到表格中了。
以上就是从Web中获取数据的一个例子(第9章会更详细地介绍如何从网页抓取数据),从其他源中获取数据的方式与之类似。在实际应用中,每个人接触到的数据源很有限,熟悉自己常用的数据类型,知道如何将其导入到Power BI以后,下一步是进行数据整理,这才是我们真正需要掌握的核心技能。
图2-2-4 完成数据获取
2.3 数据清洗的常用操作
对导入的数据进行整理的过程一般称为“数据清洗”。之所以称之为清洗,是因为在数据分析师眼中,杂乱的数据就是“脏”数据,只有被清洗成“干净”的数据后才可以在数据分析中使用。下面我们就来认识Power Query中常用的数据清洗功能。
1.提升标题
在Excel中第一行为标题行,从第二行开始才是数据,但在Power Query中,从第一行开始就需要是数据记录,标题在数据之上。一般情况下,Power Query会自动完成提升这个步骤,如果没有,或者需要手动设置时,单击功能栏的“将第一行用作标题”就可以了,如图2-3-1所示。
图2-3-1 提升标题
单击“将第一行用作标题”旁边的下拉按钮,还有一个“将标题作为第一行”选项,实际上就是拉低标题,这个功能也特别有用。
2.更改数据类型
设置正确的数据类型非常重要,在后期数据建模和可视化过程中,很可能出现一些意想不到的错误,最后发现是数据类型设置得不对,所以一开始就要养成把数据更改为合适类型的好习惯。有两种方式更改数据类型,如图2-3-2所示。
图2-3-2 更改数据类型
3.删除错误/空值
导入后的数据,有可能出现错误(Error)或者空值(null),根据分析的需要,想要删掉错误和空值,可以通过右键单击该字段选择“删除错误”,或通过单击“筛选”按钮去掉相应勾选来完成,如图2-3-3所示。
图2-3-3 删除错误/空值
4.删除重复项
在Power Query中删除重复项非常简单,选中需要删除的列,右键单击后选择“删除重复项”即可,如图2-3-4所示。
图2-3-4 删除重复项
5.填充
在Excel数据中经常会遇到合并单元格的情况,导入到Power Query后就变成了空值,如图2-3-5所示。
图2-3-5 合并单元格导入Power Query后变为空值
因此需要把数据补充完整,在Power Query中操作很简单,直接向下填充即可,如图2-3-6所示。
图2-3-6 向下填充
这里用的是向下填充,根据需要,还有向上填充的功能。
6.合并列
在Power Query中选择需要合并的列,然后在菜单栏中单击“合并列”,弹出合并列窗口,可以设置合并列之间的分隔符,例如图2-3-7,把“区域”和“城市”两列合并,横线作为分隔符。
图2-3-7 合并列
关于新生成的合并列的列名,可以在合并列时,提前输入新的列名,也可以在合并以后,双击列名来更改。
7.拆分列
不但要会合并列,我们还要会拆分列。很多数据挤在一列的情况很常见,学会如何拆分就非常重要。Power Query中的拆分列类似Excel中的分列,不过Power Query的功能更强大。
比如把刚才合并的列再拆分一下,以横线为分隔符,又变成合并前的格式了,如图2-3-8所示。
图2-3-8 拆分列
在Power Query中,可以选择按字符数、数字或字母来分列,如果列中包含多个分隔符,还可以选择按哪个位置的分隔符来拆分。
8.分组
分组就是对明细数据进行汇总统计,比如图2-3-8中拆分后的数据,我们要计算各区域的1月合计金额,单击“分组依据”,选择字段名为“区域”,操作方式选择为“求和”,求和对象为“1月”,如图2-3-9所示。
图2-3-9 分组
9.提取
Power Query可以按照长度、首字符、尾字符、范围等来提取字符,比如提取前2个字符,如图2-3-10所示。
图2-3-10 提取
10.行列转置
数据处理中有时需要行列互相转换,比如把城市变成列标签,月份变成行标签,可直接单击行列转置,如图2-3-11所示。
图2-3-11 直接单击行列转置
是不是发现哪里有些不对劲?之前的列标签月份不见了。这是因为转置的时候,只转数据的部分,月份并不在数据区,我们要想保留月份,先要把月份降下来,这里用到前面介绍的“将标题作为第一行”,如图2-3-12所示。
图2-3-12 将标题作为第一行
标题下降以后,再进行转置,就是我们需要的结果,如图2-3-13所示。
转置完成,还要再把第一行城市提升为标题,操作方式如图2-3-13所示。
图2-3-13 转置
11.行列操作
Power Query的行列操作十分灵活,非常适合大规模数据操作,具体功能如图2-3-14所示。
图2-3-14 行列操作
12.逆透视列
由于数据分析的需要,我们经常要将二维表变为一维表,在Excel中需要很多操作步骤才能完成,而在Power Query中,通过逆透视功能,可以一键将二维表变为一维表。
以前面的数据为例,可以选中需要逆透视的列,单击“逆透视列”,或者选中不需要逆透视的列,单击“逆透视其他列”,两种方式效果是一样的,哪种方便就用哪种,逆透视的效果如图2-3-15所示。
图2-3-15 逆透视列
13.透视列
做分析需要一维表,而为了展现的需要,常常还要把一维表变成二维表,这类似Excel中的数据透视表功能。在Power Query中同样可以一键透视,比如把刚才的一维表变成原样,选中“属性”列,透视值列选择“值”,如图2-3-16所示。
图2-3-16 透视列
单击“确定”就变回原来的二维表了,如图2-3-17所示。
上述这些功能都是在原表数据基础上的分分合合,做数据分析的时候还经常需要在原有数据的基础上增加一些辅助数据,比如加入新列、新行,或者从其他表中添加进来更多维度的数据,这些就是数据丰富的过程,接下来我们进行介绍。
图2-3-17 完成透视列
14.添加列
Power Query中添加列有添加重复列、索引列、条件列、自定义列、示例中的列等形式,如图2-3-18所示。
下面分别介绍添加列的这几种形式。
(1)添加重复列
添加重复列就是复制选中的某一列,以便对该列的数据进行处理而不损坏原有列的数据,如图2-3-19所示。
图2-3-18 添加列
图2-3-19 添加重复列
(2)添加索引列
索引列就是为每行增加一个序号,记录每一行所在的位置,可以选择从0或1开始,比如为下表添加索引列,从1开始,结果如图2-3-20所示。
图2-3-20 添加索引列
(3)添加条件列
单击添加条件列,在弹出的窗口中输入指定的条件,比如根据1月的数据,如果大于300,返回“一级”,否则返回“二级”,如图2-3-21所示。
图2-3-21 添加条件列
这个条件其实就相当于Excel中的IF函数,得到的结果如图2-3-22所示。
(4)添加自定义列
自定义列就是用M函数(关于M函数,2.5节会专门介绍)生成新的一列,比如添加一列1月和2月的合计数,就可以利用添加自定义列的功能,如图2-3-23所示。
图2-3-22 条件列的结果
图2-3-23 添加自定义列
Power Query中的字段用[ ]框住,这里[1月]和[2月]不需要手动输入,直接单击右边的字段名就可以,结果如图2-3-24所示。
图2-3-24 自定义列
(5)添加示例中的列
该功能相当于Excel中的智能填充,单击“示例中的列”,可以选择按所选内容或者按所有列来分析,在弹出的窗口中,只要输入前两行数据,系统根据两个示例,自动分析所需要的数据,并填充到所有行。
比如从城市列中提取区号数字,可以输入前两行,下面的会自动显示,如图2-3-25所示。
图2-3-25 添加示例中的列
结果如图2-3-26所示。
图2-3-26 示例中的列
15.追加查询
追加查询是在现有记录的基础上,在下方添加新的行数据,它是一种纵向合并。例如有两个表格式相同,需要合并为一个表,单击“追加查询”,如图2-3-27所示。
图2-3-27 追加查询
两个表追加查询的结果如图2-3-28所示。
图2-3-28 追加查询结果
16.合并查询
如果说追加查询是纵向合并,那么合并查询就是横向合并,它相当于Excel的VLOOKUP函数,就是匹配其他表格中的数据,不过Power Query中的合并查询要比VLOOKUP函数的功能强大得多,并且操作也更简单。
例如有两个表,一个是每个城市的数据表,另外一个表是包含这些城市基础信息的表。现在需要在数据表中添加每个城市对应的电话区号,单击“合并查询”,如图2-3-29所示。
先选择两个表相互匹配的字段,单击这两个表的“城市”列,下方联结种类选择“左外部:第一个表的所有行,第二个表的匹配行”,就得到了合并后的表,如图2-3-30所示。
合并查询匹配过来的是一个表,所以每行都显示为Table,为了得到某一列,可以单击右上角的展开,选择我们需要的字段,合并查询就完成了。表中增加了每个城市对应的区号,如图2-3-31所示。
图2-3-29 合并查询
图2-3-30 合并查询表
图2-3-31 合并查询结果
通过这种方式可以一次性匹配多列,如图2-3-30所示,展开的时候,选择需要的列就可以了,而VLOOKUP函数一次只能匹配一列,当需要一次性匹配多列时,Power Query的优势更加明显。
以上介绍的是Power Query的各项数据处理操作,基本上涵盖了常用的界面功能。虽然看上去都很简单,但若能熟练并灵活运用,基本能完成大部分数据处理的工作。
2.4 应用示例:二维表转一维表
数据分析的源数据应该是规范的,而规范的一个标准就是数据源应该是一维表,它会让之后的数据分析工作变得简单高效。什么是一维表?为什么要转为一维表呢?本节就来回答这些问题,并介绍如何将各种形式的二维表转化为一维表。
2.4.1 什么是一维表
在Excel中常见的是二维表,如图2-4-1所示。
一维表如图2-4-2所示。
图2-4-1 二维表
图2-4-2 一维表
通过以上二维表和一维表的直观比较,应该能分清楚什么是一维表、什么是二维表了,简单来说,一维表具有如下特点。
(1)每一列是一个维度,列名就是该列值的共同属性。
(2)每一行是一条独立的记录。
而这两点对于二维表都不适用。
2.4.2 为什么要转为一维表
二维表更符合我们日常的阅读习惯,信息更浓缩,适合展示结果,但作为源数据进行数据分析时,一维表更合适。
一维表的每一列是一个独立的维度,列名或字段名就是数据分析的基础,比如制作图表时直接把字段拖入某个属性框中,以及后面将会学习的利用列名与其他表建立关系、编写DAX(数据分析表达式)时直接使用列名等。
那么如何将二维表和一维表相互转换呢?
一维表转换成二维表很简单,在Excel中也可以轻松做到,就是利用数据透视表,在Power Query中也有同样的透视功能,这里不再赘述,下面主要介绍如何将二维表转换成一维表。
2.4.3 二维表转为一维表的方法
利用Power Query将二维表转为一维表十分方便,下面以常见的几种结构的表格为例进行介绍。
1.行列标题均为单层的二维表
对于图2-4-1中的二维表,这种简单的二维表直接使用逆透视功能就可以快速转为一维表,如图2-4-3所示。
图2-4-3 逆透视其他列
可以选择需要透视的列进行“逆透视”,也可以选择不需要透视的列,然后单击“逆透视其他列”来完成。
本例中,因为需要逆透视的列有4列,而年度列只有1列,所以只选择“年度”列,单击“逆透视其他列”更为便捷,逆透视后的结果如图2-4-2所示。
提示:透视/逆透视等操作,生成的结果表的列名,需要自己手动更改,下同。
2.行标题有多层的二维表
行标题带有层级结构的二维表,如图2-4-4所示的二维表,有两层行标题。
图2-4-4 双层行标题的二维表
这种结构很清晰,但做数据分析最让人头疼的就是合并单元格,不过在Power Query中处理也并不困难,只是多了一些步骤。
将表2-4-4所示的导入Power Query编辑器后,合并单元格的内容会显示为null,如图2-4-5所示。
图2-4-5 合并单元格导入后显示为null
先把年度列向下填充,将年度数据补齐,如图2-4-6所示。
图2-4-6 年度列向下填充
然后选中“年度”和“季度”列,单击“逆透视其他列”,完成一维表的转换,如图2-4-7所示。
图2-4-7 完成二维表向一维表的转换
3.列标题有多层的二维表
列标题带有层级结构的二维表,如图2-4-8所示,有两层列标题。
图2-4-8 双层列标题的二维表
现在先不急于操作,我们先观察图2-4-8,它和上面的多层行标题的二维表是不是很相似呢?通过一次转置,图2-4-8中的二维表可以转换为多层行标题的形式,转置后的效果如图2-4-9所示。
图2-4-9 转置表
然后按照第2种方式操作就行了。
提示:在进行逆透视操作之前,记得要先提升标题(将第一行用作标题)。
4.行、列标题均有多层的二维表
行标题和列标题均带有层级结构,如图2-4-10所示。
图2-4-10 行、列标题均带有层级的二维表
看起来更复杂,但其实同样是上述几个步骤的灵活组合。将该表导入Power Query中,如图2-4-11所示。
图2-4-11 行、列标题均带有层级的二维表导入后的效果
主要操作步骤如下。
(1)将第一列的年度列向下填充,补齐合并单元格的数据,填充后的效果如图2-4-12所示。
图2-4-12 年度列向下填充
(2)将前两列,也就是年度列和季度列合并,生成年度季度列,如图2-4-13所示。
图2-4-13 合并列
仔细观察上面这个表的结构,已经转换成了上面的第3种情况,也就是列标题带层级的二维表。
(3)转置表,然后把第一列向下填充,并提升标题,就变成了很简单的结构,也就是第2种形式的二维表,如图2-4-14所示。
图2-4-14 已转换为双层行标题的二维表
(4)选中前两列,逆透视其他列,就变成了一维表,如图2-4-15所示。
图2-4-15 初步完成一维表的转换
(5)虽然已经变成一维表了,但为了和源数据维度一致,将年度季度列进行分列,分列后的效果如图2-4-16所示。
图2-4-16 分列后的效果
至此就得到了最终的一维表,看起来步骤很多,其实熟练掌握之后操作并不难。
以上几种形式的二维表,基本包含了各种复杂结构的表格,如果有更复杂的表格,比如更多层级的行、列名,也同样可以按照以上的思路通过来分步完成,主要步骤如下。
(1)将行层级先合并列,转换成单层行标题,多层列标题的二维表,也就是上面的第三种情形的表。
(2)转置,变成第二种情形的二维表。
(3)在二维表的转换过程中,除了熟练使用逆透视功能,还应该灵活掌握填充、提升标题、合并列、分列等操作。
2.5 掌握Power Query不可不知的M函数
前面介绍Power Query时都是用鼠标操作,虽然通过这些操作能完成大部分数据处理工作,但是还有些复杂的工作是处理不了的,如果想彻底驾驭Power Query,必须掌握一些高级操作。像学习Excel一样,制作表格我们只要会简单的操作就可以了,但要想学好Excel,必须熟练使用公式。Power Query的高级操作也是需要写公式函数的,Power Query中的函数称为M函数。
在之前的操作中,虽然没有直接使用M函数,但其实M函数无处不在,比如做数据清洗的每一个步骤,背后都是M函数的功劳。
在菜单栏中打开高级编辑器,可以看到每一个操作步骤的M函数,如图2-5-1所示。
图2-5-1 高级编辑器中的M函数
如果我们不进行鼠标操作,直接在编辑器中编写这些函数,也是可以得到最终的结果的。有了M函数,Power Query的数据处理过程具有了更强的可读性和可移植性。
2.5.1 为什么要学习M函数
M函数的优势和作用如下。
(1)界面操作配合M函数,更加灵活、简洁和高效。
(2)部分复杂操作必须借助M函数来完成。
2.5.2 M函数的基本规范
(1)严格区分大小写,每一个字母必须按函数规范书写,第一个字母都是大写的。
(2)表被称为Table,每行的内容是一个Record,每列的内容是一个List。
(3)行标是大括号{},比如取第一行的内容:=表{0}。
提示:Power Query的第一行从0开始。
列标用中括号[ ],比如提取自定义列的内容:=表[自定义]。
取第一行自定义列的内容:=表{0}[自定义]。
2.5.3 常用的M函数
1.聚合函数
求和:List.Sum()
求最小值:List.Min()
求最大值:List.Max()
求平均值:List.Average()
2.文本函数
求文本长度:Text.Length()
去文本空格:Text.Trim()
取前n个字符:Text.Start()
取后n个字符:Text.End()
移除文本:Text.Remove()
提取文本:Text.Select()
3.提取数据函数
从Excel表中提取数据:Excel.Workbook()
从Csv/Txt中提取数据:Csv.Document()
4.条件函数
If then else(相当于Excel中的IF函数)
2.5.4 从哪里查找M函数
想查看所有的M函数,可以参考微软官方文档。
文档里的M函数的学习资源十分丰富和系统,如图2-5-2所示。
图2-5-2 官方M函数学习资源
还有一种简单的方式可以查看所有的M函数,在Power Query中新建一个空查询,在公式栏中输入“=#shared”就把所有的M函数显示出来了,单击某个函数,最下方便出现该函数的注释,如图2-5-3所示。
图2-5-3 调出M函数列表
2.5.5 M函数学习建议
虽然M函数很强大,但是不建议一开始就专门学习,毕竟对于一个之前没有接触过编程的人来说,学习成本还是很高的,并且大部分数据处理工作,只需要用界面操作就够了,大部分函数并不常用。
建议先熟悉M函数的语法,能够读懂M函数,并把常用的函数,比如文本函数、字符串函数、日期函数等浏览一遍,知道大概都有什么函数,分别具有哪些功能,然后在数据处理过程中碰到鼠标操作难以完成的问题时,能想到有哪个M函数可以利用,直接查找并根据注释使用,或者学会修改相应的M函数代码即可。
如果既能熟练使用界面操作功能,又能灵活运用M函数,读者将在数据处理的路上快马扬鞭。在大数据已经进入日常工作和生活的今天,拥有Power Query这个利器,我们就能用很少的时间来处理数据,留下更多的时间去分析数据,发现数据背后的规律——这才是我们学习Power Query以及学习Power BI的目标。
2.6节利用两个常用的M函数来完成常见的数据清洗工作,读者可以体验一下Power Query中M函数的用法和威力。
2.6 文本处理技巧:移除和提取
本节介绍两个常用的M函数:Text.Remove和Text.Select。
以Text开头的函数是文本处理函数,下面通过几个示例介绍这两个函数的用法。
模拟原始数据如图2-6-1所示。
如果只想要中文名,就是把英文字母都去掉,可以用Text.Remove函数,添加自定义列“中文名=Text.Remove([客户],{"A".."Z"})”,如图2-6-2所示。
图2-6-1 模拟数据
图2-6-2 添加自定义列
运行结果如图2-6-3所示。
Text.Remove的参数有两个,第一个是文本,第二个是要移除的字符,第二个参数可以是文本或列表,{"A".."Z"}表示生成了一个从A到Z的列表,只要是大写字母,就从客户的信息中移除。
如果有小写字母,需要把所有字母移除,把大写的"Z"替换成小写的"z"就行了:
=Text.Remove([客户],{"A".."z"})
如果只想要英文名,要移除中文名,可以这样写:
英文名=Text.Remove([客户],{"一".."龟"})
Power Query的中文字符以Unicode连续储存,"一"的Unicode最小,正常使用的汉字中,"龟"的Unicode最大,因此{"一".."龟"}就是包含了所有正常使用汉字的列表,可以利用它,移除所有的中文字符,如图2-6-4所示。
图2-6-3 移除大写英文字母
图2-6-4 移除中文字符
如果有更多种类的文本数据不规则地堆放在一起,如图2-6-5中的数据,想把联系方式提取出来,可以这样写:
联系方式=Text.Remove([客户],{"A".."z","一".."龟"})
把中文字符和英文字符的列表都放到第二个参数中,全部移除。
不过如果字符种类很多,如图2-6-6中这样更加杂乱的字符,要提取联系方式,用Text.Remove就有点麻烦,各种奇怪的符号种类太多了,编码也不一定连续。还好有一个Text.Select函数是专门用来提取的。
图2-6-5 杂乱的原始数据
图2-6-6 更加杂乱的原始数据
Text.Select函数和Text.Remove正好相反,Text.Select只提取第二个参数中的字符,要提取图2-6-6中的联系方式,可以这样写:
联系方式=Text.Select([客户],{"0".."9"})
直接就可以得到联系方式信息。
提取各种字符的列表如图2-6-7所示。
图2-6-7 提取字符
Text.Remove函数同样可以使用图2-6-7中的列表,只是结果变为移除这些字符而已,在实际使用中,根据需要,哪种函数更便捷就用哪种函数。
学会这两个函数,遇到需要提取或者移除字符的情况直接套用就可以了。这两个函数都很简单,用起来就像Excel公式一样,但可以轻松实现在Excel中很难处理的字符提取操作。
2.7 分列技巧
分列是十分常用的数据处理技巧,2.3节曾经简单介绍过在Power Query中如何分列,但这不足以体现Power Query的强大和灵活,本节继续介绍更多的分列功能以及如何使用M函数来进行分列。
2.7.1 常规分列
我们最常见的是有固定分隔符的规范数据,这种数据按照分隔符拆分就可以了,如图2-7-1所示。
图2-7-1 按分割符分列
如果没有分割符怎么办?依然是同样的数据,如果连逗号都没有,在Power Query中还可以“按照从数字到非数字的转换”来分列,如图2-7-2所示。
还可以按大小写字母的转换来进行分列,如图2-7-3所示。
图2-7-2 按照从数字到非数字的转换分列
图2-7-3 按照从小写到大写的转换分列
2.7.2 分列到行
有时候数据都挤在一个单元格里,直接分列也可以,会分成一行多列的表,使用起来很不方便。
对于这个问题,在Power Query中还可以直接分列到行。单击“按分隔符”分列,在弹出的窗口中展开“高级选项”,选择拆分为行就可以了,如图2-7-4所示。
图2-7-4 拆分为行
2.7.3 多种分隔符进行分列
有时候我们拿到的原始数据很不规范,可能是手工录入得很随意,分割符不止一种,我们无论选择哪个都没法直接分开,如图2-7-5所示。
图2-7-5 多种分割符的情况
这时候,仅靠界面功能就难以正确分列了,不过Power Query里还有丰富的M函数,这里我们就需要用M函数来完成分列。
以图2-7-5中的数据为例,碰到这种多种字符分割的情况,就不要再用拆分界面功能了,直接添加步骤,在编辑框中输入以下内容。
=Table.SplitColumn( 提升的标题, "区号", Splitter.SplitTextByAnyDelimiter( {",",";","-","+","。"}, QuoteStyle.Csv ) )
其中提升的标题是上一个步骤的名称,使用时要更改为实际的步骤名,字符替换为实际数据的分隔符。
提示:在Power Query编辑器中,单击编辑栏旁边的fx,即为添加步骤,直接输入M函数即可。
输入的内容看起来有点长,其实主要是使用了Splitter.SplitTextByAnyDelimiter函数,把所有的分隔符做成一个列表作为该函数的第一个参数就可以了,效果如图2-7-6所示。
关于分列,主要是找出数据排列的规律,是否有固定的分隔符、固定的字符数等,找到规律以后,按规律进行拆分就可以了。
通过分列功能可以看出,Power Query的界面功能已经比较丰富了,可以处理大部分日常需求,不过对于不符合常规的数据,要掌握一些M函数才能更加得心应手地处理。
图2-7-6 利用M函数处理多种分割符的拆分
2.8 批量汇总,快速提升工作效率
Power Query除了前面提到的数据清洗功能,还有一个流行且非常好用的功能就是批量汇总数据。本节就介绍这个功能,它无须复杂操作和复杂代码就可以批量汇总多表数据。
2.8.1 批量汇总一个工作簿中的多个工作表
模拟的数据表如图2-8-1所示,工作簿有三个工作表:1月、2月、3月。
图2-8-1 模拟Excel工作簿
下面是详细的操作步骤。
(1)打开Power BI,单击“获取数据”→“Excel”,如图2-8-2所示。
(2)选择Excel工作簿所在的位置,在弹出的导航器窗口,选择任意一个工作表,单击“转换数据”,如图2-8-3所示。
(3)在Power Query编辑器窗口中,在右侧的步骤栏删掉“源”之后的所有步骤,如图2-8-4所示。
图2-8-2 获取Excel数据
图2-8-3 转换数据
图2-8-4 删除步骤
删掉这些步骤后,读者会在数据界面看到所有的三个工作表,如图2-8-5所示。
图2-8-5 需要合并的工作表
在这个界面可以筛选Name列,选择需要合并的工作表,如果不选择,就是合并所有的工作表数据。
(4)单击Data列右上角的符号,展开Data列的数据,所有工作表的数据就全部显示出来了,如图2-8-6所示。
图2-8-6 数据合并完成
然后就是数据整理的过程,比如将第一行用作标题、修改数据类型等,具体操作方法请参考2.4节的内容。
2.8.2 文件夹汇总:批量合并多工作簿数据
操作步骤如下。
(1)将需要合并的多个工作簿放在同一个文件夹中,模拟数据如图2-8-7所示。
图2-8-7 文件夹数据
(2)打开Power BI,选择“获取数据”→“全部”→“文件夹”,如图2-8-8所示。
图2-8-8 从文件夹获取数据
然后按步骤选择文件夹所在的位置。
(3)在预览界面中单击“转换数据”,如图2-8-9所示。
图2-8-9 转换数据
(4)进入Power Query编辑器,添加自定义列“=Excel.Workbook([Content])”,如图2-8-10所示。
图2-8-10 添加自定义列
这里的Excel.Workbook是一个M函数,用于将Power Query导入数据自动生成的二进制工作表转换成可读的table文件。注意这个函数的大小写字母不能写错了。
(5)展开自定义列,所有Excel工作簿的每个工作表都会显示出来,如图2-8-11所示。
图2-8-11 展开自定义列
展开之后,会有一列是所有工作簿中的工作表列表,如果只想合并部分工作表,可以在这里通过筛选实现,如果不做任何筛选,就是合并每一个工作簿中的所有数据。
(6)展开Data列,把合并的数据展示出来,如图2-8-12所示。
数据全部合并进来以后,剩下的就是整理的过程,比如删除不需要的列、提升标题、筛选无效的数据行等,读者可以多动手练习。
图2-8-12 合并完成
2.9 本章练习
有一张成绩表,数据结构如图2-9-1所示。
图2-9-1 成绩表
利用Power Query,如何将这个表快速转换为一维表?