专栏首页数据技巧Power Query中如何把多列数据合并?升级篇

Power Query中如何把多列数据合并?升级篇

之前我们了解到了如何把2列数据进行合并的基本操作,Power Query中如何把多列数据合并?也就是把多个字段进行组合并转成表。那如果这类的数据很多,如何批量转换呢?我们需要把转换的这一部分做成循环的函数即可。

多列组合=(x)=>
Table.Combine(List.Transform({1..x}, 
             each Table.FromColumns(
                                    List.Range(字段数据列表,0,1)&
                                    List.Range(字段数据列表,(_*3-3)+1,3)
                                   )
                             )          
             )

这个函数是在当前查询功能中进行的书写,但是实际我们在平时想要调用的时候,还有很多需要进一步的进行修改及优化。

1. 生成一个表格参数变量

生成这个参数变量是为了我们之后可以在直接调用来处理同类表格。

我们了解到在代码中的字段数据列表实际上是个已经经过Table.ToColumns处理过的一个列表嵌套列表格式。所以我们在优化代码的时候可以把这一步处理的过程直接作为自定义函数的部分流程。同时我们在这个里面直接把函数的参数数量及类型给固定住。

let
多列组合=(需要操作的表 as table, x as number) as table=>
Table.Combine(List.Transform({1..x}, 
             each Table.FromColumns(
                                    List.Range( Table.ToColumns(需要操作的表),0,1)&
                                    List.Range( Table.ToColumns(需要操作的表),(_*3-3)+1,3)
                                   )
                             )          
             )
in
多列组合

2. 生成固定列变量

添加固定列终点变量,可以用于固定列的选择。

let
多列组合=(需要操作的表 as table, x as number, optional 固定列终点 as number) as table=>

Table.Combine(List.Transform({1..x}, 
             each Table.FromColumns(
                                    List.Range( Table.ToColumns(需要操作的表),0,固定列终点)&
                                    List.Range( Table.ToColumns(需要操作的表),(_*3-3)+1,3)
                                   )
                             )          
             )
in
多列组合

解释:这里我们把固定列从第1列开始,往后延伸,例如输入参数2代表的是从第一列开始,连续2列作为固定列。

3. 确定终点的默认值

既然这个变量是作为可选变量,那我们要给予一个默认值,这样才不会让程序出现错误。

我们设置的默认值为第一列作为固定标题。

let
多列组合=(需要操作的表 as table, x as number, optional 固定列终点 as number) as table=>
Table.Combine(List.Transform({1..x}, 
             each Table.FromColumns(
                                    List.Range( Table.ToColumns(需要操作的表),0, 
                                                if 固定列终点=null then 1 else 固定列终点
                                               )&
                                    List.Range( Table.ToColumns(需要操作的表),(_*3-3)+1,3)
                                   )
                             )          
             )
in
多列组合

解释:通过if…then…else语句,我们给固定列终点进行一个判断,如果为空值则给与一个默认值1,也就是从0开始的1列,也就是第一列。

4. 确定需循环的列数

还有一个需要作为变量的,也就是确定是多少列进行转换合并。我们上面的例子中是以每3列进行合并,但是我们要做为一个能灵活使用的函数,更多的变量能让我们更方便的使用,适合更多的场景。

这里我们设置成为变量y。

let
多列组合=(需要操作的表 as table, x as number, y as number, optional 固定列终点 as number) as table=>
Table.Combine(List.Transform({1..x}, 
             each Table.FromColumns(
                                    List.Range( Table.ToColumns(需要操作的表),0, 
                                                if 固定列终点=null then 1 else 固定列终点
                                               )&
                                    List.Range( Table.ToColumns(需要操作的表),(_-1)*y+固定列终点),y)
                                   )
                             )          
             )
in
多列组合

解释:其中需要注意的是(_-1)*y+固定列终点这个写法。这个是判断合并数据起始位置的提取。_相当于x的需要处理循环的次数,y相当于需要转换的列数。

提取的次数

X值

Y值

固定列终点

提取的位置

1

1

3

1

1

2

2

3

1

4

3

3

3

1

7

5. 添加函数使用备注

let
多列组合=(需要操作的表 as table, x as number, y as number, optional 固定列终点 as number) as table=>
Table.Combine(List.Transform({1..x}, 
             each Table.FromColumns(
                                    List.Range( Table.ToColumns(需要操作的表),0,
                                                if 固定列终点=null then 1 else 固定列终点                                                 
                                               )&
                                    List.Range( Table.ToColumns(需要操作的表),((_-1)*y+固定列终点),y)
                                   )
                             )          
             ),
元数据=[Documentation.Name="批量多列合并",
       Documentation.Description="可以把多列相同的数据合并到一起。
第1参数是需要操作的表,第2参数x代表的是循环几次,第3参数代表的是多少列循环,第4参数是固定标题的结束位置",
       Documentation.Examples={[Description="第1列为固定列,每3列进行合并存放,一共循环2次",
                             Code="批量多列合并(源,2,3,1)",
                             Result="  "]
                              }
                              ]
in
Value.ReplaceType(多列组合,Value.Type(多列组合) meta 元数据)

这样我们就做好了一个可以适应大部分多列数据合并的自定义函数。

我们可以再来尝试下不同的数据表格来使用此函数的效果。

例1:

像这种固定列有3列,数据列是3列为一组,一共转换3次(3组同类数据)进行组合。结果如下图

因为我们可以直接调用我们之前的自定义函数。

批量多列合并(源,3,3,3)

解释:批量多列合并,这个是自定义查询的函数名称,源代表的是需处理的数据表,第2参数的3代表需要循环处理的次数,第3参数的3代表需要合并数据的列数,第4参数的3代表保留前3列作为固定列。

例2:

固定列是2列,循环5次,数据列也是2列。使用函数后获得的效果。

批量多列合并(源,5,2,2)

本文分享自微信公众号 - 数据技巧(Data-Skill),作者:逍遥跨境

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Power Query中如何把多列数据合并?

    解释:第一个List.Range目的是为了固定班级字段;第2个List.Range是为了提取第一组的数据。然后和2个列表进行组合并转成Table格式。

    逍遥之
  • 不同列不同行的数据如何进行转置?

    案例模拟文件下载 http://gofile.me/4KHV7/SUo5ywXxC

    逍遥之
  • 如何在Power Query中获取数据——表格篇(2)

    Table.First(table as table, optionaldefault as any)as any

    逍遥之
  • Python中4种更快速,更轻松的数据可视化方法(含代码)

    数据可视化是任何数据科学或机器学习项目的重要组成部分。我们通常会从探索性数据分析(EDA)开始,以获得对数据的一些见解,然后创建可视化,这确实有助于使事情更清晰...

    AiTechYun
  • 4种更快更简单实现Python数据可视化的方法

    数据可视化是数据科学或机器学习项目中十分重要的一环。通常,你需要在项目初期进行探索性的数据分析(EDA),从而对数据有一定的了解,而且创建可视化确实可以使分析的...

    机器之心
  • 4种更快更简单实现Python数据可视化的方法

    数据可视化是数据科学或机器学习项目中十分重要的一环。通常,你需要在项目初期进行探索性的数据分析(EDA),从而对数据有一定的了解,而且创建可视化确实可以使分析的...

    CDA数据分析师
  • JDK1.9-网络编程入门

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    cwl_java
  • 简单几笔素描就能“复原”真实人脸,这是沈向洋高徒出品的CSAGAN

    甚至不画嘴,也不会生成无嘴怪人。效果真实,画面高清,连脸上的皱纹,都刻画得清清楚楚。

    量子位
  • FinDOM-XSS:一款针对DOM型XSS漏洞的快速扫描工具

    FinDOM-XSS是一款针对DOM型XSS漏洞的快速扫描工具,广大安全研究人员可以利用FinDOM-XSS快速地发现/扫描出目标应用中潜在的DOM型XSS漏洞...

    FB客服
  • Linux 极限压缩

    LZMA  (Lempel-Ziv-Markov  chain-Algorithm)  基于著名的LZ77压缩算法改进的压缩/解压工具,特点:高压缩率,高解压速...

    py3study

扫码关注云+社区

领取腾讯云代金券