Power BI Power Query 认识M语言中的结构性数据
使用Power Query进行数据分析的时候,我们除了经常使用基础数据类型之外,还需要使用到结构性数据,在Power Query中我们主要接触的结构性数据包括:列表、记录和表。
我们首先在Power Query中建立一个空查询
打开Excel2016,依次点击“数据/从其他源/空白查询”,如果你当前正处于Power Query 编辑器中,那么可以在Power Query界面右侧找到“新建源/其他源/空查询”按钮
首先我们来创建一个列表,在公式编辑栏中输入内容:
= {1, 2, 3}
我们得到一个列表,请注意图中左侧各个结构性数据的图标显示异同。列表具有如下特征:
1、使用成对的花括号标识
2、列表中各个元素使用英文逗号分隔
3、列表中的元素不一定是相同数据类型,例如下面的列表包含数字和字符
4、列表中的元素可以使用基本数据类型,也可以嵌套使用结构性类型,例如下面的列表嵌套了一个列表元素
接下来我们来看记录,通过前面的方式我们重新创建一个空查询,然后在公示栏输入如下的公式
= [ A = {1,11}, B =2, C = {3} ]
我们得到了一个记录,记录的特点如下:
1、使用成对的中括号标识
2、记录中的各个元素之间使用英文逗号分隔
3、记录实际是键值对的集合,其中的每个元素是一个键值对,元素键值对表达式,左侧是该元素的键名,右侧是该元素的值,中间使用等号连接
A = {1,11}
4、记录中,每个元素的值可以使用基础数据类型,也可以使用结构性数据类型
最后我们来看看表,表的创建我们需要借助于函数才能创建,PQ里面没有为表配置像列表和记录那样的简写符
PQ里面有很多的M函数可以创建表,其基本的结构是Table.FromXXX,这里我使用Table.FromRows来创建个一个表,其他函数,请查官方文档
= Table.FromRows({ {1, "Bob", "123-4567"},{2, "Jim", "987-6543"}},{"CustomerID", "Name", "Phone"})
通过观察以上函数的结构可以发现:
1、表的数据内容通过Table.FromRows函数的第一个参数指定,该参数是一个使用列表作为其元素的列表(嵌套列表)
2、表的标题通过Table.FromRows函数的第二个参数指定,该参数是一个字符串元素构成的列表。
表虽然没有简写的标识符,但是创建表的函数有个简写方式,如下
= #table({"x", "x^2"}, {{1,1}, {2,4}, {3,9}})
标题列表作为函数的第一个参数,嵌套列表作为函数的第二个参数
最后需要讨论一下如何访问结构性数据内部的元素
对于列表和表数据类型,可以通过表达式x{y}的形式来访问子元素:
1、x是列表,y是整数:y表示位置索引,访问的是列表x中的第y+1个元素,如果不存在则返回错误
2、x是表,y是整数:y表示行索引,访问的是表x中的第y+1行,如果不存在则返回错误
3、x是表,y是记录:记录y中键值与表x列名相同,且值对应相等的行记录,未找到返回错误
{"a","b","c"}{0} // "a" #table({"A","B"},{{0,1},{2,1}}){0} // [A=0,B=1] #table({"A","B"},{{0,1},{2,1}}){[A=2]} // [A=2,B=1]
可以使用x{y}?表达式,在未找到结果是,返回空值,但是如果找到了多个匹配项,仍然会返回错误
{true, false}{2}? // null #table({"A","B"},{{0,1},{2,1}}){[B=3]} // null #table({"A","B"},{{0,1},{2,1}}){[B=1]} // error
对于记录数据类型,可通过表达式x[y]形式访问子元素,同样它也有x[y]?的形式
1、x是记录,y单元素键名:找出记录x中键名为y的值,如果未找到键名将返回错误
[A=1,B=2][B] // 2 [A=1,B=2][C] // error [A=1,B=2][C]? // null
2、x是记录,y是多元素记录:
[A=1,B=2][[B]] // [B=2] [A=1,B=2][[C]] // error [A=1,B=2][[B],[C]]? // [B=2,C=null]