PowerQuery技巧之通过List.Transform(Many())实现行列互换

合集下载

powerquery进阶函数

powerquery进阶函数

powerquery进阶函数Power Query是Excel Power BI的分析工具之一,可以大幅提高数据清洗和转换速度。

在使用Power Query时,熟悉其各种函数是非常必要的,因为函数可以帮助我们更快地实现数据清洗和转换的任务。

在本文中,我们将介绍一些Power Query进阶函数,帮助您更全面地掌握这个工具。

1、List.TransformList.Transform函数是Power Query中常用的一种函数,它的作用是对一个列表中的每一项进行自定义的转换操作。

例如,我们有一个包含5个元素的列表,需要对其中每一个元素进行加1的操作,可以使用List.Transform函数来处理:```let // 定义数据源srcData = {1..5},newList = List.Transform(srcData, each _ + 1) // 对每一项进行自定义操作innewList```结果为:```{2,3,4,5,6}```当然,List.Transform函数不仅仅只能对数值类型的数据进行操作,对于文本、日期等其他类型的数据也可以进行自定义的转换操作。

2、Table.TransformColumns表格转换是Power Query的主要任务之一,其中Table.TransformColumns函数可以用于修改已有表格的列。

这个函数接受两个参数:- 表格数据- 函数列表```let // 定义数据源srcData = Table.FromRecords({[Col1 = "A", Col2 = "B", Col3 = "C"],[Col1 = "D", Col2 = "E", Col3 = "F"],[Col1 = "G", Col2 = "H", Col3 = "I"]}),// 对表格中每一列进行转换操作newTable = Table.TransformColumns(srcData, { {"Col1", each Text.Lower(_), type text}, {"Col2", each Text.Lower(_), type text}, {"Col3", each Text.Lower(_), type text} })innewTable``````| Col1 | Col2 | Col3 || ---- | ---- | ---- || a | b | c || d | e | f || g | h | i |```Table.TransformColumns函数对于表格中列的批处理操作非常有用,尤其是在需要对多列进行批操作时,是一个非常实用的函数。

powerquery公式

powerquery公式

powerquery公式PowerQuery是一个数据处理工具,可以帮助用户在 Excel 中更加高效地处理数据。

在 PowerQuery 中,公式是一个非常重要的组成部分,可以帮助用户完成各种数据处理任务。

以下是一些常见的PowerQuery 公式:1. 过滤数据:过滤数据是 PowerQuery 中最基本的任务之一。

可以使用公式“Filter Rows”来过滤数据,该公式可以根据某些条件来筛选出符合条件的行,例如:= Table.SelectRows(#”Previous Step”, each [Column1] > 50)2. 合并列:当我们需要把多个列中的数据合并成一个列时,可以使用公式“Merge Columns”。

例如:= Table.TransformColumns(#”Previous Step”, {{“Column1”, eachbine(List.Transform(_, Text.From), “,”), type text}})3. 拆分列:有时候我们需要把一个列中的数据拆分成多个列,可以使用公式“Split Columns”。

例如:= Table.SplitColumn(#”Previous Step”, “Column1”,Splitter.SplitTextByDelimiter(“,”), {“Column1.1”, “Column1.2”})4. 添加列:我们可以使用公式“Add Column”在数据中添加新的列。

例如:= Table.AddColumn(#”Previous Step”, “New Column”, each [Column1] + [Column2])5. 替换值:有时候我们需要将某些列中的特定值替换为其他值,在 PowerQuery 中,可以使用公式“Replace Values”。

例如:= Table.ReplaceValue(#”Previous Step”, “Old Value”, “New Value”, Replacer.ReplaceValue, {“Column1”, “Column2”})6. 数据类型转换:在 PowerQuery 中,我们可以使用公式“Change Type”来将某些列的数据类型转换为其他类型。

PowerQuery技巧之处理列名包含合并单元格的几种思路

PowerQuery技巧之处理列名包含合并单元格的几种思路

一直没能说服公司小伙伴不要用合并单元格,因此我接收到的原始表格总是充满了各种合并单元格。

最头痛的是列名有合并的。

比如下面这样的(且不说这难看的屎黄):merged_cells.png列名有合并单元格也就罢了,关键是这合并单元格也是动态的——不同时间提交过来的表格,合并单元格的具体内容会有变化。

真是整死个人么也幺哥,整死个人么也幺哥……目前总结了四种方法:一、釜底抽薪法最牛逼最有效的当然是说服提供表格的小伙伴停止使用坑爹的合并单元格(以及莫名其妙的底纹)。

二、自己辛苦手动修改法就是每次收到excel表格后,我自己手动取消合并单元格,把列名整理成合规的格式。

但作为一个超级懒人,每次来了一个表格都要手动改半天,太不优雅了。

于是有了第三种方法。

三、利用list.zip()函数合成重命名列名表达式法用powerquery大法,引入数据源后,合并单元格会被打散。

以下是关键步骤:1.将合并单元格的第一行提升为表格标题,这样一来,之前是合并单元格的列名会变成类似于“column5”、“column6”之类的,其他都是正常的列名。

而第二行的数据,正常列名下面的值变成了null,以“columnX”开头的列下面是我们要提取出来的列名,如截图中“投放媒体”下面的四个值。

2.利用powerquery访问行的方法,得到表格第一行的值,基本函数是Record.FieldValues()。

3.然后将第二步得到的list和Table.ColumnNames()函数获取的表格列名用List.Zip()函数进行合并,得到一个包含list的list,为叙述方便,将其命名为M。

这时用List.Transform(M,bineTextByDelimiter(""))将M中每个子list的元素合并成一个,这样我们就得到一个近似于完美的目标表格列名。

之所以说,近似完美,是因为M进行这样的变换后(命名为MM),其中包含“Column6百度信息流作”这样的元素,我们需要将“Column6”这样的字母和数字去掉,只保留文本。

PowerQuery技巧之List.Split 这个新函数,列表拆分更容易了

PowerQuery技巧之List.Split 这个新函数,列表拆分更容易了

List.Split 这个新函数,列表拆分更容易了昨天,有朋友有个列表拆分的需求,然后获得方法中有一个步骤的公式用到List.Split这个函数,却在使用过程中就出错了。

这明显就是说没有List.Split这个函数嘛。

所以我查了一下微软的在线Power Query的文档,结果发现里面也没有。

于是,我在Power BI里试了一下——好吧,原来Power BI里已经有了,如下图所示:既然有了新函数,试一把,将1到9的列表,按每2个一组拆分成多个列表:非常简单!有没有?对的,这个函数实际就是将一个列表的内容,按每多少个一组进行拆分,最后不够个数的直接归为一组,如下图所示:可是,但是,问题是,现在估计大多数Excel的Power Query里都没有这个函数,那怎么办呢?可以尝试写个自定义的函数,来实现类似的功能:= List.Split=(l,s)=>List.Transform({1..Number.Round(List.Count(l)/s,0,RoundingMode.Up)},(n)=>List.Range(l,(n-1)*s,s))主要思路:1、先根据每组多少个的参数确定最终能分成多少个列表(待拆分列表的元素个数除以每组数量并向上舍入):Number.Round(List.Count(l)/s,0,RoundingMode.Up);2、通过List.Transform函数,逐个去取要分成一组的元素List.Range(l,(n-1)s,s)。

总的来说,并复杂,也不需要太多的技巧和套路,但还是要把基础的函数学好练好,理解其中的参数含义和数据引用方式,慢慢就能灵活运用了。

*。

powerquery行列转换函数

powerquery行列转换函数

powerquery行列转换函数引言:在数据分析和处理过程中,我们经常会遇到数据从行转换为列或从列转换为行的情况。

Power Query是一个强大的数据处理工具,它提供了一些内置的函数来帮助用户轻松地进行行列转换。

本文将介绍Power Query中的行列转换函数,以及如何使用这些函数来处理数据。

什么是Power Query?Power Query是一个用于查询、连接、转换和加载数据的数据处理工具。

它是Microsoft Power BI的一部分,可以帮助用户轻松地处理大量的数据。

Power Query可以连接到多种数据源,如Excel、SQL数据库、Web页面等,并将数据转换为用户可以轻松分析和报告的格式。

行列转换函数Power Query提供了一些内置的函数,用于执行行列转换操作。

以下是一些常用的行列转换函数:1. Text.Split():此函数将文本按指定的分隔符分割成多部分。

例如,如果你有一个按逗号分隔的名字列表,可以使用此函数将其转换为名字的行。

2. Text combine():此函数将多个文本元素合并为一个文本字符串。

例如,如果你有一个按名字分组的列表,可以使用此函数将其转换为按名字分组的列。

3. Table.SelectRows():此函数根据指定的条件选择表格中的行。

例如,如果你有一个按名字分组的表格,可以使用此函数将其转换为按名字分组的列。

4. Table.SelectColumns():此函数根据指定的条件选择表格中的列。

例如,如果你有一个按名字分组的表格,可以使用此函数将其转换为按名字分组的行。

5. Table.Expand():此函数将表格中的嵌套数据展开为一列。

例如,如果你有一个包含嵌套数据的表格,可以使用此函数将其展开为单独的一列。

如何使用行列转换函数?以下是一个简单的例子,说明如何在Power Query中使用行列转换函数:1. 打开Power Query,并连接到你的数据源。

PowerQuery技巧之对列表指定批量替换函数详解

PowerQuery技巧之对列表指定批量替换函数详解

PowerQuery技巧之对列表指定批量替换函数详解Power Query 中对列表指定批量替换函数详解List.ReplaceMatchingItems(list as list, replacements as list, optional equationCriteria as any) as list第1参数是数据列表;第2参数是批量替换的列表,每一个新旧替换作为一个list并组合成一个总的list(相当于大list套小list,要有双层嵌套{{}}格式);第3参数可以指定一个可选相等条件值来控制相等测试(也就是用来替代被替换的值)。

例:List.ReplaceMatchingItems({1..10}, {{1,"a"}}) ={"a",2..10}解释:用"a"替换1生成新列表List.ReplaceMatchingItems({1..10}, {{1,"a"},{2,"b"}) ={"a","b",3..10}解释:用"a"替换1,用"b"替换2生成列表List.ReplaceMatchingItems({{1..3},{1..10}}, {{{1..3},{"a".."c"}}}) ={{"a".."c"},{1..10}}解释:用{"a".."c"}列表替换{1..3}列表并生成新的组合列表。

单个列表用可以用多个值替换,多个列表则需用列表进行替换。

List.ReplaceMatchingItems({1..5},{{1,0}},each _<3) ={0,0,3,4,5} 解释:使用第2参数的旧值和第3参数做比较,如果符合则替换条件为第3参数,如果不符合,替换条件则是第3参数的相反值。

PowerQuery技巧之List类常用函数总结

List类常用函数总结函数名解释List.First返回第一个值,如果为空可以返回另外一个值List.FirstN返回前N个值的list列表st返回最后值,如果为空可以返回另外一个值stN返回后N个值的list列表List.Select按给定条件选择项目List.FindText返回包含某文本的文本list列表List.Range选择从指定位置开始若干个项目的子集List.Alternate根据复杂的隔行规则取数组成新的list列表List.InsertRange在指定位置插入新的list列表List.ReplaceValue替换list中指定的值为新值List.ReplaceRange从指定的位置起替换新的listList.ReplaceMatchingItems替换list1中的多个值{{旧,新},{旧,新}},有比较选项List.RemoveRange从指定的位置起删除若干个值List.RemoveFirstN删除前面几个值List.RemoveLastN删除后面几个值List.RemoveMatchingItems从list1中删除list2中出现的值,有比较选项List.RemoveItems从list1中删除list2中出现的值List.RemoveNulls删除list中的空值List.Skip跳过list中的前几项List.Reverse逆序list列表List.Repeat按指定次数重复list获得一个新的listbine合并多个list为新listList.IsEmpty判断list是否为空List.Contains判断list列表是否包含某值List.ContainsAll判断list1中是否包含list2的所有值List.ContainsAny判断list1中是否包含list2的任意值。

PowerQuery技巧之连续日期展开问题

let 源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content], 类型 = Table.TransformColumnTypes(源,{{"人员", type text}, {"开始时间", type datetime}, {"结束时间", type datetime}}) 构建 = Table.AddColumn(类型, "a", each [a={Number.RoundUp(Number.From([开始时间]))..Number.RoundDown(Number.From([结 删除列 = Table.RemoveColumns(构建,{"开始时间", "结束时间"}), 展开list = Table.ExpandListColumn(删除列, "a"), 展开record = Table.ExpandRecordColumn(展开list, "a", {"开始时间", "结束时间"})
连续日期展开问题
题1:
如图,将左表的日期范围,展开为连续的日期。
在此之前,我们已经介绍过不少数字类型的展开问题,比如"1-99"展开,我们只需要先将首尾拆分,然后构建list展开即可。
{Number.From(Text.BeforeDelimiter([范围],"-"))..Number.From(Text.AfterDelimiter([范围],"-"))} 逻辑很简单,但是涉及到一些数据类型的转换,一定要细心。
let 源 = Excel.CurrentWorkbook(){[Name="表2"]}[Content], 日期 = Table.AddColumn(源, "日期", each List.Transform({Number.From(Date.From(Text.BeforeDelimiter([日期范围],"-")) 展开 = Table.ExpandListColumn(日期, "日期")

PowerQuery技巧之深入理解函数

语言中,函数主要有内建函数,比如Text.From这种系统自带的;自定义函数,形如就是函数的意思了。

我们先来看自定义函数,比如fx = (x)=>x+1。

创建一个名为6再来看一个简单的例子:点击添加列-自定义列,直接输入1,点击确定。

我们看到Table.AddColumn的第三参数,虽然我们输入的是1,但是系统自动在那么问题来了,这个each是什么东西?再看一眼Table.AddColumn第三参数的类型,显示为发现这么写并没有报错,并且底部以及左侧的图标都表明这是一个function。

fx=each _+1:此时发现,当我们给任意一个数字时,返回的结果都会是我们给的参数咦,这不正是本文开头所讲的自定义函数的效果么?当自定义函数只有一个参数时,(x)=>x的写法完全与each _等价。

没错,当自定义函数只有一个参数时,所以,可以把刚才添加列中的第三参数里的each 1,写成(x)=>1,效果完全一样。

OK,这个理解了我们继续往下看。

如果刚才添加列输入的不是1而是_呢?我们已经知道了each _就相当于(x)=>x,而(x)=>x看上去好像更容易理解一些,就是你传入的是什么,返回的还是什么。

那么在= Table.AddColumn(源, "自定义", each _)中,传入的是什么?是源这张表,但是因为上下文的原因,这张表被拆分成了很多行,所以每一行只返回当前行的所有列,结果为一个record。

而record又能深化出其中的字段,比如我们要其中[索引]字段下的值,那么可以_[索引],第一行返回的结果为1。

所以我们平时添加列,比如要[索引]*10,公式为= Table.AddColumn(源, "自定义", each [索引]*10),而在这个[索引]的前面,实际上是省略了一个_的:当然如果你用的是each,此处的_可以省略,但是如果你写成(x)=>的形式,就不能省略,要写成= Table.AddColumn(源, "自定义", (x)=> x[索引]*10)。

PowerQuery技巧之Table.TransformRows()

Table.TransformRows()Table.TransformRows()可以抽象地概括为function(table as table, transform as function) as list,大意为:该函数的第一个参数为表格,第一个参数按行分解所得的记录将会作为自变量传入第二个参数指定的函数,指定函数的结果会按照行的顺序化为串列的元素。

这个函数等价于List.Transform(Table.ToRecords(table), each transform(_))。

比如,=Table.TransformRows(#table({"A"}, {{1},{2}}),(x)=> x[A])的结果为{1,2}。

这个函数与Record类的函数进行搭配可以获得意想不到的效果。

接下来将会使用M套路108式中的连续衰减问题来说明Table.TransformRows()的用法,如果对该问题的背景不太清楚,请自行回顾该问题的文章。

从上表(DB1)到下表的转换,如果需要比较严谨的解答,可以使用以下代码:List.Transform(Table.ToRows( DB1 ),( x ) ⇒List.Accumulate(List.Skip( x, 2 ),List.FirstN( x, 2 ),( y, z ) ⇒bine({y,{ st( y ) - z }}))),Table.ColumnNames( DB1 )),DataType=Table.TransformColumnTypes(Solution1,List.Zip({Table.ColumnNames( DB1 ),bine({{ Text.Type },List.Repeat( { Int64.Type }, 6 )})}))inDataType如果很有信心制作的报表的格式不会发生变化,可以通过Table.FromRecords()+Table.TransformRows()+Record.TransformFields()的组合进行解答;。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

通过List.Transform(Many())实现行列互换
除了Table.Transpose()与List.Zip()能够完成行列互换,List.TransformMany()也可实现这一动作,不过代码相对没有那么简洁。

如果需要为上表添加行加总与列加总,使之转化为:
需要定义以下fnAddSum()函数:
( input as list ) as list ⇒
let
Outcome=
List.Transform(
input,
each
bine(
{
_,
{ List.Sum( _ ) }
}
)
)
in
Outcome
该函数通过List.Transform()历遍input里的每一个串列(list),并在这些串列的结尾处添加一个元素,这个元素为串列原先所有的元素之和。

为实现行列转换,需要定义以下fnTranspose()函数:
( input as list ) as list ⇒
let
Outcome=
List.TransformMany(
{ input },
each
List.Numbers(
0,
List.Count( _{0} )
),
( x, y ) ⇒ List.Transform( x, each _{y} )
)
in
Outcome
fnTranspose()的轴心骨为List.TransfromMany(),这个函数产生的串列如果代入List.Count(),其产生的结果将会等于该函数的第一个参数和第二个参数分别代入List.Count()的结果之乘积。

为了构造出Table.FromRows()或者Table.FromColumns的第一个参数所需要的结构,List.TransformMany()的第一个参数和第二个参数这个两个之中需要有一个满足代入List.Count()的结果为1,而另外一个代入List.Count()的结果为表格的行数或者列数。

在fnTranspose()中List.TransformMany()的第一个参数由于在自变量input 外面套一个{},第一个参数代入List.Count()的结果为1。

第二个参数构造的串列代入List.Count()后的结果刚好为行的总数或者列的总数,为在第三个参数历遍处于同一行或者同一列的元素作准备。

值得一提的是,其实fnTranspose()也可以围绕着
List.Transform()进行构造:
( input as list ) as list ⇒
let
Outcome=
List.Transform(
List.Numbers(
0,
List.Count( input{0} )
),
(y) ⇒
List.Transform(
input,
(x) ⇒ x{y}
)
)
in
Outcome
使用List.Transform()构造fnTranspose()其实十分类似VBA的For..Next里再套For..Next,外层的List.Transform()控制的是行数或者列数,而内层的List.Transform()则是控制对应的列数或者行数。

最后,为还原丢失的数据类型需要定义fnDataType()函数:
( input as table, datatype as type ) as table ⇒
let
Outcome=
Table.TransformColumnTypes(
input,
List.TransformMany(
Table.ColumnNames( input ),
each { datatype },
( x, y ) ⇒ { x, y }
)
)
in
Outcome
这个函数需要理解了List.TransformMany()里第一个参数调用了Table.ColumnNames的结果(该结果如果代入List.Count()将等于表格的列数),第二个参数由于串列里只有一个元素,所有List.TransformMany()的结果的元素的个数会与列数一样(列数=列数*1)。

以下为从列开始转化的代码:。

相关文档
最新文档