前言:
今天本来准备尝试写一篇关于机器学习的文章记录一下开学生活,然后就开始找数据,还是Excel格式的数据。因为数据量太大的原因,我就想到用python来处理初始数据,前几篇文章介绍了openpyxl,大家应该还有印象。本来我以为利用openpyxl处理起来会得心应手,结果出乎我所料,这一次的数据处理用这个库竟然不那么"容易",这里的不容易是指在处理过程当中让我心烦意乱,代码冗余让我难受。究其原因,我认为是我自己非要"大材小用"了,本来openpyxl我是很看好的,结果非要拿来处理琐碎数据,自找苦吃。
正文:
于是,想起来之前用过的Excel自带的VBA语言,我就尝试用VBA进行数据处理,发现思路清晰,处理过程不拖泥带水,现将代码解析奉上,以飨读者。真的非常简单,而且一学就会,希望大家跟着走一遍。
首先原始数据表如下图,在这个excel文件中,共有名称为2001至2016共16个sheet表,并且这16个表数据结构一致:
如图所示,我的要求是:新建一个sheet表,命名为"newsheet",然后依次提取上图中每个表格黄色和橙色标题下的数据,并且把橙色标题放在第一列,为帮助大家理解,我先上结果图(或者说效果图)如下:
那么,现在,我们可以想象一下,如果要满足这个数据处理要求,我们应该怎么办呢?
刚才说了,用VBA进行编程处理,首先打开Excel中的VBA编程小窗口,如下图所示:
然后在第二步中的空白代码框里输入以下代码,然后点击运行按钮,就实现了我们上面提到的数据处理要求,接下来咱们看看这个代码是怎么为我们工作的:
乍一看上面这个代码挺长!看着让人头疼!!其实现在跟着我一起剖析此代码,你会发现特简单!!!
先看整体结构,开头如下所示,意思是我们创建了一个名称叫做"复制感兴趣区域"的过程,所谓过程的意思就是接下来通过一个什么样的程序实现我们的要求:
结尾如下,意思是这个过程结束了,可以鸣金收兵了:
接下来是:
这句代码的意思是在名称为"2016"的sheet表之后新建一个名为"newsheet"的表格。为什么要在2016这个表后面新建呢?其实就是这个表是最后一个表,新建表放在最后我觉得比较美观而已,新建在2015、2010等表的后面都可以,不强制…
紧接着是:
这个代码看似很长,实际上就是一句代码重复执行功能罢了,目的在于复制表头。以第一行为例,意思是:让新建表格的A1单元格的值等于第一个sheet表中的Q2单元格的值。后面代码以此类推…可能你会问,为什么要等于第一个sheet表呢??因为前面说过了,每个表格数据结构都是一样滴~等于任何一个表的表头都一样的,把代码中的sheets(1)改成sheets(2)、sheets(3)等等效果都一样。
接下来是重头戏:
映入眼帘的首先就是c=2,这里的这个c的值实际上就是操作过程中不断动态变化的新建sheet表(newsheet)的当前工作行数的值。紧接着是一个for循环,也就是说让i从1到16循环16次,结合前文,你应该能猜出,这个16次的含义是依次遍历16个表格进行数据提取。那么现在关键就在于如何提取这个数据,大家看到上面我用红框圈起来了四个部分,实际上这四个部分也是借用一个功能的模板,现在我挑选第二个红框部分进行讲解,代码如下,解释请直接看注释:
到此数据处理结束,结果图上面已经给出了。
Ok,初始数据有了,接下来我可以愉快的尝试机器学习的代码了,如果尝试了机器学习,继续在此记录分享给大家,喜欢的话就点个赞啊大兄弟,我也好有动力分享出来哈哈。因为代码格式上传后会乱,所以需要源代码的可以发送消息“我要建议”给公众号(“科研萌新”公众号),会回复邮箱,联系邮箱索要即可。
不妥之处还请大家指正,谢谢!