【源数据才是大麻烦】又一个清洗不规范源数据的例子
正是那些不规范的源数据,才造成了我们需要经常加班加点。掌握这些数据清洗方法并灵活运用是必须的!
阅读本文时,跟着操作案例文件效果更好。案例文件获取方式见文末。
01
数据和要求
数据很简单:
我们有4个季度的数据,每个季度3列。为了后续分析,我们需要将这份数据整理成下面的规范的形式:
02
实现方法
就案例中展示的数据来说,要得到结果表很简单。只需要两步:
选择Q2,Q3,Q4的数据分别复制到Q1数据下方
添加一列,每九行分别填写Q1,Q2,Q3,Q4
全部操作可以在2分钟之内轻松完成。
但是这个操作只适合偶尔操作和少量的数据。如果数据量比较大,或每天都要做类似的工作,这种手工操作效率太低,也不能建立自动化的数据处理过程。所以,我们还是需要这个最强大的数据处理工具:Power Query。
首先,选中源数据区域的任意单元格,点击数据选项卡中的“从表格”:
数据导入到Power Query编辑器中(会首先弹出对话框,将数据区域转换为超级表):
在转换选项卡中,点击转置:
将表格转置:
选中左边第一列“Column1”,在转换选项卡中,选择向下填充:
完成填充后,在转换选项卡中,点击分组依据,对表格按照季度分组:
在对话框中,将分组列选择为Column1,将新列名修改为“分组”,操作选择“所有行”:
点击确定,数据分为了四组:
删除第一列“Column1”:
在转换选项卡中,点击“转换为列表”:
数据转换为列表后,多了一个选项卡“列表工具-转换”:
点击其中最左边的按钮“到表”,将数据转换为Table,在出现的对话框中做如下选择:
得到结果:
在添加列选项卡中,点击自定义列:
在对话框中,输入公式:
=Table.AddColumn(#"转换为表", "Custom", (OT)=> Table.AddColumn( Table.Transpose(Table.RemoveColumns(OT[Column1],{"Column1"})),"季度", (IT)=> OT[Column1][Column1]{0}))
如下图:
点击确定后,插入新列:
删除左边第一列“Column1”,
点击“自定义”列标题右侧的展开按钮,点击确定:
得到结果:
删除左边第一列:
点击列Custom标题右侧的展开按钮,点击确定:
得到结果:
修改列名:
点击主页选项卡中的关闭并上载:
得到结果:
大功告成!
总结
在这个案例中,我们使用了跟以前介绍过的不一样的方法。主要的区别是使用的表(Table)和列表(List)的转换。另外,大部分功能都是通过菜单按钮完成的,只有一步进行表格转置时使用的手工输入的函数。
其实,即使菜单功能,也是使用各种函数完成的。关于Power Query的这些函数和使用,我们在Power Query中级课程中会详细介绍!
这里,我们将本案例的代码附在下面,供大家参考:
let
源 = Excel.CurrentWorkbook(){[Name="表2"]}[Content],
转置表 = Table.Transpose(源),
向下填充 = Table.FillDown(转置表,{"Column1"}),
分组的行 = Table.Group(向下填充, {"Column1"}, {{"分组", each _, type table [Column1=text, Column2=any, Column3=any, Column4=any, Column5=any, Column6=any, Column7=any, Column8=any, Column9=any, Column10=any]}}),
删除的列 = Table.RemoveColumns(分组的行,{"Column1"}),
分组 = 删除的列[分组],
转换为表 = Table.FromList(分组, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
已添加自定义 = Table.AddColumn(转换为表, "自定义", each Table.AddColumn(#"转换为表", "Custom", (OT)=> Table.AddColumn( Table.Transpose(Table.RemoveColumns(OT[Column1],{"Column1"})),"季度", (IT)=> OT[Column1][Column1]{0}))),
删除的列1 = Table.RemoveColumns(已添加自定义,{"Column1"}),
#"展开的“自定义”" = Table.ExpandTableColumn(删除的列1, "自定义", {"Column1", "Custom"}, {"Column1", "Custom"}),
删除的列2 = Table.RemoveColumns(#"展开的“自定义”",{"Column1"}),
#"展开的“Custom”" = Table.ExpandTableColumn(删除的列2, "Custom", {"Column1", "Column2", "Column3", "季度"}, {"Column1", "Column2", "Column3", "季度"}),
重命名的列 = Table.RenameColumns(#"展开的“Custom”",{{"Column1", "类别"}, {"Column2", "产品"}, {"Column3", "数量"}})
in
重命名的列
加入E学会,学习更多Power Query数据处理方法
关注本公众号,点击底部菜单“联系客服”,与客服取得联系,索取“多列转置”案例文件