Power BI的数据处理是通过Power Query完成的。
2.1 Power Query编辑器
在Power BI Desktop中,如果还没有任何数据,点击“获取数据”,选择相应的数据格式导入后,就可以进入Power Query编辑器。
点击“转换数据”进入Power Query编辑器:
Power Query编辑器:
在Power Query编辑器中对数据处理完成后,点击左上角的“关闭并应用”将数据导入Power BI。
2.2 Power Query的优点
- 操作简单:无须掌握复杂的函数,仅使用界面上的功能即可完成大部分数据处理工作。
- 数据量不限:突破传统Excel数据行的限制。
- 自动化:处理过程全记录,每次数据源更新后刷新即可,无须重复操作。
2.3 获取数据
Power BI数据分析的第一步是获取数据,Power BI支持几乎任何来源的任何结构、任何形式的数据。
Power Query不仅能从本地获取数据,还能从网页抓取数据,比如实时抓取股票涨跌、外汇牌价等交易数据。
以从中国银行网站上抓取外汇牌价信息为例,点击“获取数据”,选择“Web”:
输入URL:https://www.boc.cn/sourcedb/whpj/
点击“确定”,等待Power BI获取网页数据,选择需要分析的表格数据并点击“转换数据”进入Power Query编辑器:
2.4 数据清洗的常用操作
在Power Query中对导入的数据进行整理的过程一般称为“数据清洗”。
2.4.1 提升标题
在Excel中第一行为标题行,从第二行开始才是数据,但在Power Query中,从第一行开始就需要是数据记录,标题在数据之上。一般情况下,Power Query会自动完成提升这个步骤,如果没有,或者需要手动设置时,单击功能栏的“将第一行用作标题”就可以了:
注:单击“将第一行用作标题”旁边的下拉按钮,还有一个“将标题作为第一行”选项,实际上就是拉低标题,这个功能也特别有用。
2.4.2 更改数据类型
更改数据类型对数据分析也是极其重要的,有两种方式更改数据的数据类型:
方法1:
方法2:
2.4.3 删除错误/空值
导入后的数据,有可能出现错误(Error)或者空值(null),根据分析的需要,若要删掉错误和空值,可以通过右键单击该字段选择“删除错误”,或通过单击“筛选”按钮去掉相应勾选来完成。
方式1:
方式2:
2.4.4 删除重复项
选中需要删除的列,右键单击后选择“删除重复项”。
2.4.5 填充
在Excel数据中使用合并单元格的合并的单元格,导入到Power Query后其余合并的单元格会变成空值。
在Power Query中可使用向下填充将数据补全:
2.4.6 合并列
在Power Query中选择需要合并的列,在菜单栏中单击“合并列”,弹出合并列窗口,可以设置合并列之间的分隔符。
2.4.7 拆分列
拆分列即合并列的逆操作,可以根据按字符数、数字或字母来分列,如果列中包含多个分隔符,还可以选择按哪个位置的分隔符来拆分。
2.4.8 分组
分组即对明细数据进行汇总统计。如对所有行进行计数:
2.4.9 提取
Power Query可以按照长度、首字符、尾字符、范围等来提取字符。
2.4.10 行列转置
数据处理中有时需要行列互相转换,直接点击行列转置实现。
一般直接转置会导致数据丢失,因此需先“将标题作为第一行”,再进行转置,最后记得再“将第一行作为标题”。
2.4.11 行列操作
Power Query的行列操作十分灵活,非常适合大规模数据操作,包括选择列、删除列、保留行和删除行:
2.4.12 逆透视列
Power Query中的逆透视功能,能够一键将二维表变为一维表。
可以选中需要逆透视的列,单击“逆透视列”,或者选中不需要逆透视的列,单击“逆透视其他列”。
2.4.13 透视列
Power Query中的透视功能,能够一键将一维表变为二维表。
选中需要透视的列,单击“透视列”,并选择相应的值列。
2.4.14 添加列
Power Query中添加列有添加重复列、索引列、条件列、自定义列、示例中的列等形式。
- 添加重复列
添加重复列即复制选中的某一列,以便对该列的数据进行处理而不破坏原数据。
- 添加索引列
索引列即为每行增加一个序号,记录每一行所在的位置,可以选择从0或1开始。
- 添加条件列
添加条件列可根据指定的条件,返回特定的值存放在条件列中。这个条件相当于Excel中的IF函数。
4.添加自定义列
自定义列即用M函数生成新的一列。
5. 添加示例中的列
添加示例中的列相当于Excel中的智能填充,单击“示例中的列”,可以选择按所选内容或者按所有列来分析,在弹出的窗口中,只要输入前两行数据,系统根据两个示例,自动分析所需要的数据,并填充到所有行。
2.4.15 追加查询
追加查询是在现有记录的基础上,在下方添加新的行数据,它是一种纵向合并。
例如有两个表格式相同,需要合并为一个表,单击“追加查询”。
2.4.16 合并查询
合并查询即横向合并,它相当于Excel的VLOOKUP函数,用于匹配其他表格中的数据。
例如有两张表,一张是每个员工的调动数据表,另外一个表是包含这些员工基础信息表。现在需要在员工基础信息表中添加每个员工对应的调动情况。
点击“合并查询”,先选择两个表相互匹配的字段,点击这两个表的“姓名”列,根据需要选择联结种类。
合并查询匹配过来的是一个表,所以每行都显示为Table,为了得到某一列,可以单击右上角的展开,选择需要的字段以完成合并查询。可以观察到表中增加了每个员工对应的调动情况。
通过这种方式可以一次性匹配多列,在展开时,选择需要的列就可以了,而VLOOKUP函数一次只能匹配一列。
2.5 二维表转一维表
二维表更符合人们日常的阅读习惯,信息更浓缩,展现效果更好,但作为源数据进行数据分析时,一维表更合适。
以下是一个二维表的示例:
而一维表每一列是一个维度,列名就是该列值的共同属性;每一行是一条独立的记录。
以下是一个一维表的示例:
根据二维表结构的不同,转换成一维表的方式也有所不同。
2.5.1 行列标题均为单层的二维表
直接使用Power Query中的逆透视功能。
选中“季度”列,点击“逆透视列”下的“逆透视其他列”。
注:透视/逆透视等操作,生成的结果表的列名,需自己手动更改。
2.5.2 行标题有多层的二维表
行标题带有层级结构的二维表,有两层行标题,如下表所示:
将该表导入Power Query编辑器后,合并单元格的内容会显示为null。
首先把年度列向下填充,将年度数据补齐:
接着选中“年度”和“季度”列,点击“逆透视其他列”,完成一维表的转换。
2.5.3 列标题有多层的二维表
列标题带有层级结构的二维表,有两层列标题,如下表所示:
将该表导入Power Query编辑器后,点击“转置”,即可将这种类型的二维表转换为行标题有多层的二维表类型,接着“将第一行用作标题”,选中第一列,“逆透视其他列”即可。
2.5.4 行、列标题均有多层的二维表
行标题和列标题均带有层级结构,如下表所示:
将该表导入Power Query编辑器:
- 将“年度”列向下填充:
- 将“年度”列和“季度”列合并,生成年度季度列:
“将标题作为第一行”:
此时,该二维表已转换为列标题有多层的二维表。
-
“转置”表,并“将第一行用作标题”,“替换值”,就转换成了行标题有多层的二维表:
-
选中前两列,逆透视其他列,就转换成了一维表:
5. 为了和源数据维度一致,将年度季度列进行分列,得到最终的一维表:
2.6 M函数
Power Query中的函数称为M函数,可实现更复杂的操作。
数据清洗的每一个步骤,都是使用M函数实现的,只是Power Query将一些常用操作简化成了键鼠操作。
打开菜单栏视图→高级编辑器,可查看M函数实现的数据清洗的每一步操作:
2.6.1 M函数的基本规范
- 严格区分大小写,每一个字母必须按函数规范书写,第一个字母都是大写的。
- 表被称为Table,每行的内容是一个Record,每列的内容是一个List。
- 行标是大括号
{}
,比如取第一行的内容:=表{0}
;列标用中括号[]
,比如提取自定义列的内容:=表[自定义]
。取第一行自定义列的内容:=表{0}[自定义]
。
注:Power Query的第一行从0开始。
2.6.2 常用的M函数
- 聚合函数
- 求和:List.Sum()
- 求最小值:List.Min()
- 求最大值:List.Max()
- 求平均值:List.Average()
- 文本函数
- 求文本长度:Text.Length()
- 去文本空格:Text.Trim()
- 取前n个字符:Text.Start()
- 取后n个字符:Text.End()
- 移除文本:Text.Remove()
- 提取文本:Text.Select()
提取字符类型 | M函数 |
---|---|
提取数字 | Text.Select([文本数据],{“0”…“9”}) |
提取大写英文字符 | Text.Select([文本数据],{“A”…“Z”}) |
提取小写英文字符 | Text.Select([文本数据],{“a”…“z”}) |
提取全部英文字符 | Text.Select([文本数据],{“A”…“z”}) |
提取全部中文字符 | Text.Select([文本数据],{“一”…“龟”}) |
Text.Remove()函数同样可以使用上表,不同的是结果变为移除这些字符。
- 提取数据函数
- 从Excel表中提取数据:Excel.Workbook()
- 从Csv/Txt中提取数据:Csv.Document()
- 条件函数
- If then else(相当于Excel中的IF函数)
2.7 分列技巧
2.7.1 常规分列
最常见的是有固定分隔符的规范数据,这种数据按照分隔符拆分即可。
若没有分隔符,还可以考虑“按字符数”、“按位置”、“按照从小写到大写的转换”、“按照从大写到小写的转换”、“按照从数字到非数字的转换”、“按照从非数字到数字的转换”。
高级选项中还能将一个单元格中的内容拆分为多行。
2.7.2 多种分隔符
如果分隔符有多种,那么可以使用M函数进行分列:
=Table.SplitColumn(
提升的标题, "区号",
Splitter.SplitTextByAnyDelimiter(
{",",";","-","+","。"},
QuoteStyle.Csv
)
)
其中提升的标题是上一个步骤的名称,使用时要更改为实际的步骤名,字符替换为实际数据的分隔符。
2.8 批量汇总
批量汇总即将多个表的内容汇总到一个表中。
2.8.1 批量汇总多表数据
一个工作薄有多张工作表:
-
将该工作薄导入Power BI,选择任意一个工作表,单击“转换数据”:
-
在Power Query编辑器窗口中,在右侧的步骤栏删掉“源”之后的所有步骤:
-
筛选Name列,选择需要合并的工作表,如果不选择,就是合并所有的工作表数据。
-
展开Data列的数据,得到合并所有工作表的效果:
-
对数据表进行相应的数据处理,得到最终的表格:
2.8.2 批量合并多工作簿数据
-
将需要合并的多个工作簿放在同一个文件夹中:
-
在Power BI中选择“获取数据”→“全部”→“文件夹”,选择文件夹所在位置:
-
在预览界面中点击“转换数据”:
-
进入Power Query编辑器,添加自定义列
=Excel.Workbook([Content])
:
Excel.Workbook是一个M函数,用于将Power Query导入数据自动生成的二进制工作表转换成可读的table文件。 -
展开自定义列,所有Excel工作簿的每个工作表都会显示出来:
展开之后,会有一列是所有工作簿中的工作表列表,如果只想合并部分工作表,可以在这里通过筛选实现,如果不做任何筛选,就是合并每一个工作簿中的所有数据。 -
展开Data列,把合并的数据展示出来:
-
经过数据整理,得到最终的数据表: