前面几篇博客介绍了 Power Query (简称 PQ) 的数据源和 M 语言的基础知识,现在开始进入数据处理部分。本篇接着介绍 如何在 PQ 中添加列。...添加列是很重要的一个操作,在 PQ 的查询编辑器界面,有一个专门【添加列】功能区。在讲解添加列的过程中,我们会逐步介绍一些相关知识点和 PQ 的操作细节。...在 PQ 查询编辑器界面中,切换到功能区【添加列】,找到【索引列】,这是一个下拉框,选择 【从 1】: [watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N0b25lMDgyMw...,之前我在博客中介绍过 pandas 中如何实现行转列的方法,大家可以参考: pandas 行转列一种典型输出报表的解决方法 在 PQ 中实现行转列思路类似,操作也比较简单。...切换到【添加列】功能区,点击【条件列】,先增加一列,列名为 "Chinese",这一列存储学生的语文成绩。注意下面界面中,输出的地方要选择 Score 这一列,而不是输入一个值。
例3 第3个参数是一个函数,是在第2参数指定列以外表格中的所有列需要进行的操作。 在前面的操作中,成绩列和学科列都有了操作,那剩余其他列(姓名列)也需要进行操作,那就要使用到第3参数了。...如果第2参数的中的学科写错或者定义了其他未在操作表中的列名,则可以通过第4参数来控制返回。...因为指定的列里有 “班级”,但是在原来的表格中不存在,所以会产生错误,但是第4参数有指定1,也就是忽略错误,最终返回的结果如图所示。除了找到的成绩列表外,其余的列数据都在后面添加了个“A”。 ?...例5 如果是想让所有的列都进行同样的操作,也就是不指定列,使得把所有列都是作为其他列来处理,使用的是第3参数来进行操作的话,此时第2参数可以直接使用空列来表示,也就是不指定列。...例6 因为第3参数是针对所有未指定的列来进行操作,如果有些指定列不想操作,只想保留的话,那指定列可以使用each _来进行保留。
下图中,假设左边是一个直观的 BOM 结构展示,数据在 Excel 中存储格式如中间部分所示:第一列为物料编码的级别,第二列为物料编码。...Query (PQ) 中做相同的处理。...将 Excel 工作表的 BOM 数据通过 Ctrl + T 变成 Excel 的 Table,加载到 Power Query 查询编辑器(操作过程可以参考我之前的博客),此时界面如下。...Grouped 这一列中的每个单元格,不是一个单值数据,而是 Table 类型的数据,所以将其称为结构化列。...最后,对 SelectedMaterial 结构化列展开,只保留 MaterialCode 这一列。
转换成 (一) 把单个字段组合成一个列 Table.ToColumns(源) (二) 把需要合并的样式单独组合 Table.FromColumns(List.Range(单字段组合,0,1)&
确定需求: a) 通过列数参数来改变最终的列数 b) 更改列数标题不影响数据运行 c) 更改数据源标题不影响数据运行 2....确定变量 a) 列数 b) 列数标题名 c) 数据源标题名 单列数据转多列,主要涉及的就是分组后的索引添加,然后进行透视。 (二) 主要涉及知识点 1....添加索引并取模 Table.AddIndexColumn,Number.Mod(指定行或列数) 2....分组依据的同时表内添加索引 Table.Group,Table.AddIndexColumn 3. 展开数据后的透视 透视值关系到指定列还是指定行 4....字段名的动态引用 Table.ToRows(列数字段表){0}{0}
将左边的数据放在 Excel 工作表中,通过 Ctrl + T 变成表,然后加载到 Power Query,将查询命名为 Hierarchy。示例数据已经上传到 Github,方便大家对照学习。...shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N0b25lMDgyMw==,size_16,color_FFFFFF,t_70] 对 Level2 结构化字段进行展开操作...MergedLevel1Table, "Level2", {"Child"}, {"Level2"}) in ExpandedLevel2 为了方便,我先创建了一个名为 Level2 的查询,现在这个查询也可以在 M 脚本中编写...再用同样的方法与 Level3 和 Level4 进行合并查询再展开。
之前我们了解到了如何把2列数据进行合并的基本操作,Power Query中如何把多列数据合并?也就是把多个字段进行组合并转成表。那如果这类的数据很多,如何批量转换呢?...我们了解到在代码中的字段数据列表实际上是个已经经过Table.ToColumns处理过的一个列表嵌套列表格式。所以我们在优化代码的时候可以把这一步处理的过程直接作为自定义函数的部分流程。...同时我们在这个里面直接把函数的参数数量及类型给固定住。 ?...解释:这里我们把固定列从第1列开始,往后延伸,例如输入参数2代表的是从第一列开始,连续2列作为固定列。...确定需循环的列数 还有一个需要作为变量的,也就是确定是多少列进行转换合并。我们上面的例子中是以每3列进行合并,但是我们要做为一个能灵活使用的函数,更多的变量能让我们更方便的使用,适合更多的场景。
一般情况下,我们如果需要添加列,可以一列一列根据需要进行添加,那如果我们需要根据固定的需求进行批量添加,那如何操作呢? 原始表 ? 结果表 ?...我们在添加的列的时候,有2个主要参数,一个是标题,一个则是添加列里的内容,如果我们需要进行批量添加的话,这2个参数最好是作为变量进行循环填充。我们来看下如何操作吧。...列数:需要增加多少列,就根据相应的填写。 2. x代表的是表格,也就是增加列后的表格名称,初始值是原始表格。 3. y代表的是第几次的循环,0代表第一次,同时也是作为参数组里的列对应值的位置。...如果需要在添加列里使用公式,则函数参数设置成表类型。 因为在循环添加列时表是重复调用的,所以如果把表设置成函数的参数,方便后期循环调取使用。 我们以最简单的 [价格]*1.1这个公式为例。...如果需要在添加列中使用这个公式,那我们可以设定自定义函数 (x)=>x[价格]*1.1,这样之后我们可以直接以表为参数进行替代。 此时我们的参数组里的内容则是函数类型。 ?
在本系列的第 14 篇,我介绍了类似 BOM 的数据应该怎么存储,以及在 Power Query 中如何展开。那篇文章使用创建辅助查询的方法,从而简化了在查询编辑器的操作,小白都是可以理解和掌握的。...但如果我们来回顾一下处理的过程,有很多重复的操作,比如合并和展开第 2 级数据,合并和展开第 3 级数据等等。有编程概念的人立即想到,应该用循环来解决啊。...所以,首先考虑将这些重复的代码封装在一个函数中。在 Power Query 中,如果能借助查询编辑器操作的地方,尽量在 UI 中进行操作,没必要手写代码。...我们将重点放到 M 语言的代码中来。...text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N0b25lMDgyMw==,size_16,color_FFFFFF,t_70] 这样就得到了 level3: [2019092010493592.png] 测试没有问题,就可以创建查询来实现展开所有层级了
合并查询在Power Query中是很成熟的应用,相当于SQL中的各种JOIN(抽时间会写几篇SQL的join,算是SQL的小核心)。...但同时,在Power Query中合并查询是一个常见的影响刷新效率的因素。在我的工作中,经常会遇到对一些非文件夹性质的数据源进行合并查询操作,所以我一直在想,有没有办法可以对其进行优化。...– 0 秒 以上的确能够得出结论:合并查询时,列数的多少的确会影响效率, 以上还揭示了:在以上两个查询中,读取数据是立刻发生的,几乎不占用时间,相比之下,最开始的两次查询中读取数据的时间甚至要比执行SQL...节省算力:提前知晓同一字段的所有筛选器,先进行合并,再进行计算,避免对同一字段重复计算。 这就是下一篇的内容了。...参考文档: Chris Webb https://blog.crossjoin.co.uk/2020/05/31/optimising-the-performance-of-power-query-merges-in-power-bi-part
在网抓的过程中,经常会碰到抓回来的数据格式很多都是记录,列表格式,这类格式的数据。 ? 正常来说只需要展开到表格即可,但是转到表后还有类似的混合数据,怎么去展开呢? ?...这样的数据没有展开符号,怎么样才能快速的把list全部展开,直接使用Table.ExpandListColumn函数对Value列进行展开会报错。 ?...此时如果只需要List进行展开,则可以把Value是list的直接筛选出来在展开就可以了。...所以只有2列数据,一列是标题,一列是值。 ? 那标题的是不是可以直接放在上面呢?通过转置后把标题放到第一行,再进行标题的提升就可以了。 ?...这样只需要单独展开就可以了,这样也更方便同时也保留了其他非list格式的数据列。 ? 如果觉得有帮助,那麻烦您进行转发,让更多的人能够提高自身的工作效率。
我们导入的时候有一个日期列,格式如下 ? 对我们来说可以理解为,日/月/年,但是我们看下导入到Power Query中会如何显示? ?...右击需要更改的列 ? 2. 点击使用区域设置并使用英语(英国) ? 这样我们就更改完成了。 3. 返回效果 ? (二) 公式法 1. 函数Table.TransformColumnTypes说明 ?...我们看下此函数有3个参数 参数位置 类型 含义 第1参数 table 需要操作的表 第2参数 list 批量转换指定列及类型 可选第3参数 text 区域格式 看下之前的类型转换的函数书写 ?
(一) 含义 在Power Query中@是表示范围运算符,通常在使用递归时运用其自身。 (二) 一般使用 把函数自身参数运用于其他函数。...同时if的then是作为结束判断语句,else是作为循环运行的计算公式。
(一) 概念介绍 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对I/O(输入/输出)的数据做临时存储,这部分预留的内存空间叫缓冲区。 使用缓冲区有两个好处: 减少实际物理读写次数。...缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数,一般在实际过程中,我们一般是先将文件读入内存,再从内存写入到别的地方,这样在输入输出过程中我们都可以用缓存来提升IO...缓冲区的作用也是用来临时存储数据,可以理解为是I/O操作中数据的中转站。
Power Query2018年就已经支持python了,你尝试过吗?今天说一下power query使用python的步骤和简单应用。...至此,便获取了表中的 ID 列。 ?...总结: 在power query 中 python 使用 dataset 变量来访问当前表的数据; dataset 是 pandas 中 的 DataFrame; 使用python语法对 dataset...的行和列进行操作,可以添加、删除、修改、过滤等 使用python导出表 使用POWER BI进行数据清洗和转换的过程中,经常会得到一张行数很多的表,而在POWER BI中导出表不太方便(少量数据可以直接复制粘贴...) df.to_excel("D:/源.xlsx", index=None) 至此,便成功将power query 中的文件导出至本地。
数据定位 (一) 列(字段)定位 1. 定位本查询: 步骤名[字段名]=源[成绩] 2. 定位其他查询: 查询名[字段名]=成绩表[成绩] (二) 行(记录)定位 1....指定字段当前行直接使用[字段名],例如在添加列里面直接使用[字段名]代表的就是当前指定的字段名的当前行的值。 2....我们已经知道返回第一次,最后一次以及所有的,那如果是返回第2次出现的需要如何操作呢?原理是一样的,我们首先通过查找所有的,然后再找第2个项即可。...List.PositionOf({1,2,1,4,1},{1,2},1)=-1 解释:因为是完全匹配,也就是要查找列表{1,2},但是查找的列表中没有这个列表值,所以返回-1。...因为我们要从列表中挑选数据,格式是{列表}{项目的位置},所以2个都是列表格式,我们在之前计算出结果的基础上套上一层{}代表列表。{3-1}这个就是我们要找的项目的位置。
对于列的拆分一般使用的比较多,也相对容易,通过菜单栏上的拆分列就能搞定,那如果是多列拆分又希望能一一对应的话需要如何操作呢?...比较明显的是分级列,分隔符为全角字符下的逗号,而说明列则是换行符进行分列。2列分别是2种不同的分隔符进行的分割。如果直接在导入数据后对列进行分割会有什么样的效果呢?...List.Zip ({ Text.Split([分级],","), Text.Split([说明],"#(lf)") }) 通过对文本进行拆分后并重新组合成新的列,然后展开列表得到图...但是如何现在直接进行展开的话,也会有问题,我们需要的是2列平行的数据,而展开的时候是展开到列,变成2列的数据了,如图5所示,这又不是我们所希望的结果。 ?...这时只需要在展开的时候选择提取值的选项,这个功能相对平时用的不多,但是对于目前的这种状况非常实用,如图6所示在使用分隔符合并的时候需要注意的就是,此分隔符需要在2组数据中都未出现过,可以使用特殊字符进行
小勤:Power Query里怎么动态地得到当前行的所有内容? 大海:不是直接用下划线就可以了吗?...如果临时碰到某些问题,能清晰知道要处理的是什么东西(对象类别),比如这个例子里的记录(Record),那就可以去查相应的函数——Power Query的函数虽然很多,但这种通过类名+英文全称的命名方式,...小勤:Power Query这种函数写法的确便于快速从名称识别其基本用途,但写起来却好长……不过还好,听说很快有智能提示了,真的好期待!...到时甚至不用去翻帮助文档函数了…… 大海:我也好期待…… 在线M函数快查及系列文章链接(建议复制到浏览器中打开后收藏使用): https://app.powerbi.com/view?...eyJrIjoiZDVhZDBlMTYtNDkzNC00YWFjLWFhMmMtMmI3NTk2Y2ZhMzc3IiwidCI6ImUxMTAyMjkxLTNkYzUtNDA1OC1iMDc3LWQ0YzU4YWJkMWRkOCIsImMiOjEwfQ%3D%3D 注意,因为公众号文章是不能直接通过点击的方式跳转到外部链接的,所以需要大家动手复制到浏览器中打开
其中x代表的就是{1..3}的列表中每一项。 2....List.Transform({"ab","ac","bc"},(x)=>Text.Contains(x,"a")) ={TRUE,TRUE,FALSE} 解释:针对列表中查找是否包含关键词"a"的字符...批量操作 List.Transform({"ab","ac","abc"},eachText.Select(_,{"a","c"})) ={"a","ac","ac"} 解释:批量把列表中带有"a"和"...Text.Combine(List.Transform({"ab","ac","abc"},eachText.Select(_,{"a","c"})),"/") =a/ac/ac 解释:批量把列表中带有..._"代表的是{"ab","ac","abc"}列表中的元素。
function)as list 第1参数是列表格式;第2参数是对列表需要处理的函数;第3参数是对处理后的列表和原先列表再进行处理的函数,这第3参数的基本固定写法就是(x,y)=>运算公式,x代表原列表(同时需参考第...请注意第所有参数最终返回格式也需要是列表格式。...List.TransformMany({1,2,3},(a)=>{a+1,a+2},(x,y)=>x) ={1,1,2,2,3,3} 解释:虽然x代表的是原始列表,但是如果y列表中是多项处理,则会自动生成重复项...List.Sum},(x,y)=>y(x)) ={List.Sum({1..3}),List.Sum({2..4})} ={6,9} 解释:第2参数列表里面直接是一个单函数,所以y(x)代表把x作为参数代入到y函数中,
领取专属 10元无门槛券
手把手带您无忧上云