Excel中的Power Query功能清洗不规范数据

PowerQuery是Excel中的新功能,其强大的功能主要依托于强大且丰富的M函数来完成。对于日常中的一些不规范的数据,使用该功能处理可以快速方便地完成。


今天小必老师给大家讲一下关于如何使用EXcel中的Power Query功能完成不规范的数据的清理。


如下图所示,是从教育部高等教育司的网站上下载下来的一份2019年6月的全国成人高等院校名单。具体的素材下载的地址为:

http://www.moe.gov.cn/srcsite/A03/moe_634/201706/t20170614_306900.html



将上面的数据处理成下面的规范的易于分析的数据。


具体的操作思路为:主要对数据进行局部条件分组。是解决问题的最核心的问题。

对于上面的问题,主要的步骤如下。


Step-01:将源数据加载至Power Query中。依次单击【数据】-【获取数据】-【来自文件】-【从工作簿】选项,在弹出的对话框中打开要处理的工作簿。如图所示。


加载至Power Query中结果如下图所示,然后单击【转换数据】。


Step-02:在Power Query中将多余的步骤删除掉,只剩余一下“源”.如图所示。

在原代码的基础上进行深化数据。具体的代码如下:

= Excel.Workbook(File.Contents("C:\Users\81532\Desktop\数据.xlsx"), null, true){[Name="sheet1"]}[Data]


Step-03:删除前面的两行没有用的数据,然后再次提升标题。

= Table.Skip(源,2)
= Table.PromoteHeaders(删除行)


Step-04:将“”序号列的数据类型修改为“文本”。如下图所示。

= Table.TransformColumnTypes(提升标题,{"序号", type text})


Step-05:对数据进行局部分组。如下图所示。

局部分组 = Table.Group(更改类型,
                         "序号",
                         {
                             "m",
                             each 
                             Table.RemoveColumns(
                                                  Table.Skip(_,1),
                                                  {"序号","Column6"}
                                                  )
                         },
                         0,
                         (x,y)=> if Text.Length(y)>=5 then 1 else 0
                         )


Step-06:展开数据,如下图所示。


Step-07:处理首列,提升左括号前面的数据。如下图所示。

= Table.TransformColumns(展开,{"序号",each Text.BeforeDelimiter(_,"(")})


Step-08:最后加载数据至工作表中即可。


完整的代码如下图所示。

let
    源 = Excel.Workbook(File.Contents("C:\Users\81532\Desktop\数据.xlsx"), null, true){[Name="sheet1"]}[Data],
    删除行 = Table.Skip(源,2),
    提升标题 = Table.PromoteHeaders(删除行),
    更改类型 = Table.TransformColumnTypes(提升标题,{"序号", type text}),
    局部分组 = Table.Group(更改类型,
                         "序号",
                         {
                             "m",
                             each 
                             Table.RemoveColumns(
                                                  Table.Skip(_,1),
                                                  {"序号","Column6"}
                                                  )
                         },
                         0,
                         (x,y)=> if Text.Length(y)>=5 then 1 else 0
                         ),
    展开 = Table.ExpandTableColumn(局部分组, "m", {"学校名称", "学校标识码", "主管部门", "备注"}),
    提取 = Table.TransformColumns(展开,{"序号",each Text.BeforeDelimiter(_,"(")})
in
    提取

原文链接:,转发请注明来源!