首页 > 技术文章 > Power BI Power Query 认识M语言中的结构性数据

alexywt 2019-08-21 15:06 原文

使用Power Query进行数据分析的时候,我们除了经常使用基础数据类型之外,还需要使用到结构性数据,在Power Query中我们主要接触的结构性数据包括:列表、记录和表。

 

我们首先在Power Query中建立一个空查询

打开Excel2016,依次点击“数据/从其他源/空白查询”,如果你当前正处于Power Query 编辑器中,那么可以在Power Query界面右侧找到“新建源/其他源/空查询”按钮

1 1

 

首先我们来创建一个列表,在公式编辑栏中输入内容:

= {1, 2, 3}

1

我们得到一个列表,请注意图中左侧各个结构性数据的图标显示异同。列表具有如下特征:

1、使用成对的花括号标识

2、列表中各个元素使用英文逗号分隔

3、列表中的元素不一定是相同数据类型,例如下面的列表包含数字和字符

1

4、列表中的元素可以使用基本数据类型,也可以嵌套使用结构性类型,例如下面的列表嵌套了一个列表元素

1

 

接下来我们来看记录,通过前面的方式我们重新创建一个空查询,然后在公示栏输入如下的公式

= [ A = {1,11}, B =2, C = {3} ]

1

我们得到了一个记录,记录的特点如下:

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

通过观察以上函数的结构可以发现:

1、表的数据内容通过Table.FromRows函数的第一个参数指定,该参数是一个使用列表作为其元素的列表(嵌套列表)

2、表的标题通过Table.FromRows函数的第二个参数指定,该参数是一个字符串元素构成的列表。

 

表虽然没有简写的标识符,但是创建表的函数有个简写方式,如下

= #table({"x", "x^2"}, {{1,1}, {2,4}, {3,9}})

1

标题列表作为函数的第一个参数,嵌套列表作为函数的第二个参数

 

最后需要讨论一下如何访问结构性数据内部的元素

对于列表和表数据类型,可以通过表达式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]

推荐阅读