powerquery分组_Power Query中的Table.Group函数详细分析

本文深入解析了 Power Query 中的 Table.Group 函数,该函数用于根据指定列对数据进行分组和汇总计算。内容包括函数的参数解释、使用示例以及全局分组和局部分组的概念。通过实例展示了如何使用该函数进行数据聚合,如求和、计数和格式转换等操作,同时也探讨了第五个参数——匹配函数的作用和用法。
部署运行你感兴趣的模型镜像

在我们操作过程中,使用分组依据进行汇总计算的操作应该是非常的多的,我们对于这个函数还是非常有必要深入了解下。

Table.Group

按为每行指定的列 key 中的值对 table 的行进行分组。 对于每个组,将构造一条记录,其中包含键列(及其值)以及由 aggregatedColumns 指定的任何聚合列。 注意,如果多个键与比较器匹配,将返回不同的键。此函数无法保证返回固定的行顺序。 或者也可以指定 groupKind 和 comparer。

Table.Group(table as table, key as any, aggregatedColumns as list, optional groupKind as nullable number, optional comparer as nullable function) as table

示例:对表进行分组,同时添加一个聚合列 [total],其中包含价格总和("each List.Sum([price])")。

用法:Table.Group(Table.FromRecords({[CustomerID= 1, price = 20], [CustomerID= 2, price = 10], [CustomerID= 2, price = 20], [CustomerID= 1, price = 10], [CustomerID= 3, price = 20], [CustomerID= 3, price = 5]}), "CustomerID", {"total",each List.Sum([price])})

输出:Table.FromRecords({ [CustomerID= 1, total = 30], [CustomerID= 2, total = 30], [CustomerID= 3, total = 25]}, {"CustomerID", "total"})

以上是系统给出的这个函数的解释,初学者不一定能看得懂,那我们一步一步来分析这个函数。

此函数共有5个主要参数。Table.Group(Table,key as List,aggregatedColumns as function,groupKind,comparer),其中只有3个是必填参数。

第一个必填参数:我们很好理解,是从哪个表进行操作。

第二个必填参数:是根据哪列数据进行分组,可以任意格式。参数必须要填写,但是可以是空列表{},只有在不需要值来计算时可以使用。例如_,Table.RowCount等

第三个必填参数:怎么进行分组操作,是一个函数公式。

第四个可选参数:1=全局分组;0=局部分组(分组到下一条不等值为止)

第五个可选参数:目前所知是有2个参数组成的函数(x,y)其中X为每次分组后的第一行;Y为X当前行及下面的每一行。通常用(x,y)=>Number.From()固定格式来处理所判断后的条件值。

第三参数aggregatedColumns书写格式

={{新标题}, each 函数 ,type 类型}

={{"新标题1",each 函数},{"新标题2", each 函数}}

={{"新标题1", each 函数, type 类型},{"新标题2",each 函数, type 类型}}

={{"求和", each List.Sum([成绩]), type number},{"计数", each List.Count([学科]), type number}}

我们来举几个例子:

分组汇总计算各学生的总分。

=Table.Group(源,"姓名",{"成绩", each List.Sum( [成绩]), type number})

如果需要对求和后的成绩做一个类型定义,可以这样写

=Table.Group(源,"姓名",{"成绩", each List.Sum( [成绩]), type number })

把这个原表作为一个table类型显示在新表里。

=Table.Group(源,{},{"新标题", each _})

除了普通的函数计算,还有很多其他的函数可以应用,例如格式转换。

=Table.Group(源,"姓名",{"考试科目", each Text.Combine([学科],"/")})

主要的3个必填参数使用我们基本已经了解,那我们来说下第四参数,全局分组和局部分组。默认省略的情况下是作为全局分组,参数为1。如果需要局部分组,参数为0的话,我们可以看下同样的数据源有什么样的变化。

我们可以看第三张图,如果第四参数选择0,张三这个姓名没有进行分组统计,而王五这个姓名有分组,这个是为什么呢?

全局分组=无重复汇总=参数为1

局部分组=连续汇总=参数为0

因为王五这个名字是连续一起的,所以局部分组的时候就进行了操作,而张三这个姓名因为是隔开的,所以就没有进行分组计算,所有分开的都作为单个分组依据。

第四参数的全局匹配和局部匹配我们了解后,那我们来看下第五个参数。

第五个参数是一个匹配函数,有2个参数,我们暂定为x,y。通常用(x,y)=>Number.From()固定格式来处理所判断后的条件值。

X代表每一个分组的第一行,Y为X当前行及下面的每一行。

我们来看下如果上面这个案例把第五参数填进去会发生什么?

我们先测试X参数,我们先把x="张三"这个条件放入进第五参数中。我们可以看到,如果把参数填写成张三,显示的结果是张三80,李四93.75。这个数据是怎么来的呢?

如果只匹配X的话,他的规则是从第一个开始连续匹配,如果不满足条件即结束。意思就是指X从第一个开始配,如果符合就显示并计算,同时再往下一个进行匹配;如果不符合则结束匹配,并显示所匹配的这行数据的匹配值,并把剩余的数据全部按公式计算。

X="张三"

X匹配到了第一个张三,则显示张三,并计算80分的平均值,显示80。

然后继续匹配下一条,结果不等于张三则计算剩余数据。显示这一行去匹配的数据"李四",并计算剩余数据的平均数(90+100+90+95)/4=93.75

X="李四"

X匹配第一个不等于李四,则返回显示李四并计算剩余数据的平均数(80+90+100+90+95)/5=91

我们可以看,只要是不配的数据,都是返回张三91

讲完了X我们再来看下Y参数

我们把y参数填写张三进行匹配

显示张三90和张三95,第一个张三是匹配到当前往下直到不满足条件为止计算所包含的数据(80+90+100+90)/4,第二个张三是匹配到最后一个张三,因为已经是最后一条,所以显示95。

我们把y参数填写成王五进行匹配

显示第一个张三85,第二个王五100,第三个王五92.5

因为第一个y显示王五的是在第三行,所以返回显示第一个匹配值张三,并计算显示截至匹配到王五位置的行之前的值(含匹配行)进行计算。(80+90)/2,找到王五匹配值后计算100/1,第三个王五匹配值后计算(90+95)/2

通过以上示例我们可以大致可以了解到Table.Group这个函数的用法

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>我们正在使用Power QueryTable.SelectRows函数来筛选符合条件的行。根据引用[2]中的信息,Table.SelectRows函数的基本语法是: = Table.SelectRows(表, 筛选条件) 其中,筛选条件是一个函数,通常使用each表达式,下划线_代表当前行。 例如,如果我们有一个表格,其中包含"成绩"列,我们想筛选出成绩大于等于60的行,可以这样写: = Table.SelectRows(源, each [成绩] >= 60) 在筛选条件中,我们可以使用多个条件,用and或or连接。例如,筛选成绩在60到80之间的行: = Table.SelectRows(源, each [成绩] >= 60 and [成绩] <= 80) 另外,引用[2]中还有一个例子:筛选出评价为“加油呀”的行: = Table.SelectRows(筛选及格, each [评价]="加油呀") 因此,我们可以总结出Table.SelectRows函数的使用方法: 1. 第一个参数是要进行筛选的表。 2. 第二个参数是一个函数,通常用each开头,后面跟一个逻辑表达式。在表达式中,使用[列名]来引用当前行的列值。 注意:在Power Query中,列名是区分大小写的,并且如果列名包含空格或特殊字符,需要用引号括起来,但在M语言中,列名在方括号内时,如果列名包含空格,则必须用引号括起来,例如:each [列名] 或者如果列名是"First Name",则应该写成each [#"First Name"]。 下面是一个示例步骤: 假设我们有一个表,名为“源”,包含以下列:姓名、成绩、评价。 我们想筛选出成绩大于等于60且评价为“及格”的行。 步骤: 1.Power Query编辑器中,选择要筛选的表。 2. 在“添加列”或“转换”选项卡中,可以使用“自定义列”来添加条件,但筛选行通常直接使用筛选功能或使用Table.SelectRows函数。 3. 我们可以通过“主页”->“高级编辑器”来编写M代码,或者通过“添加步骤”在公式栏中输入。 M代码示例: 筛选后 = Table.SelectRows(源, each [成绩] >= 60 and [评价] = "及格") 如果我们要在已有的步骤中插入这一步,可以在高级编辑器中修改代码,或者在步骤窗格中右键插入步骤。 另外,引用[3]中提到了Table.Group函数,虽然与筛选无关,但其中也使用了each和_,这有助于我们理解在Power Query函数的使用方式。 最后,根据引用[4],我们还可以使用Table.AddJoinColumn来合并表,但这不是我们当前的问题。 因此,针对用户的问题,我们给出Table.SelectRows的使用方法,并举例说明。</think>### Power Query Table.SelectRows 函数使用方法 在 Power Query 中,`Table.SelectRows` 函数用于根据指定条件筛选表中的行。其基本语法为: ```powerquery Table.SelectRows( 表 as table, 筛选条件 as function ) as table ``` #### 核心参数说明: 1. **表**:需要筛选的源表 2. **筛选条件**:以 `each _` 开头的函数,其中 `_` 表示当前行,通过 `[列名]` 引用列值 - 条件表达式需返回 `true/false` 值 - 多条件用 `and`/`or` 连接 #### 使用示例: 假设有学生成绩表 `成绩表`,含列:姓名、数学、语文 1. **单条件筛选**(数学≥80分): ```powerquery Table.SelectRows(成绩表, each [数学] >= 80) ``` 2. **多条件筛选**(数学≥80 且 语文≥75): ```powerquery Table.SelectRows(成绩表, each [数学] >= 80 and [语文] >= 75) ``` 3. **文本匹配筛选**(姓名为"张三"): ```powerquery Table.SelectRows(成绩表, each [姓名] = "张三") ``` #### 注意事项: 1. **列名引用**: - 标准列名:`each [数学]` - 含空格列名:`each [#"学生姓名"]`(需用 `#""` 包裹) 2. **性能优化**: - 对大型表建议先通过 `Table.Buffer` 缓存表再筛选(引用[^1]): ```powerquery Table.SelectRows(Table.Buffer(成绩表), each ... ) ``` 3. **组合应用**: - 可配合 `Table.Group` 分组后筛选(引用[^3]): ```powerquery let 分组 = Table.Group(源表, "班级"), 筛选 = Table.TransformRows(分组, (g) => Table.SelectRows(g[子表], each [数学]>90)) in 筛选 ``` #### 实际应用场景: - 数据清洗:过滤缺失值 `each [列] <> null` - 业务分析:筛选特定时间段/状态的数据 - 异常检测:定位超出阈值范围的记录 > 引用说明: > 缓存优化技巧参考 Table.Buffer 的应用场景[^1],分组操作逻辑引用 Table.Group 的实现机制[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值