下面这种交叉式的Excel表是很常见的格式用来填写和查看都比较方便:
但是,如果想做进一步的统计分析这种格式就不方便了,需要行列转换变成如下格式的明细表:
顯然,手工操作会非常麻烦若数据量小还可以,数据量大了会耗费大量时间简直就是灾难。
Excel也可以通过数据透视表支持行列转换功能效果如下图:
但这并不是我们想要的格式。
看来只能写个程序来解决了思路也很简单:
如果用Java来实现初步估计代码量也不会少于200行,若需要结果输出成excel文件则开发工作量会更多Excel自己虽然提供了VBA,但那个麻烦度谁用谁知道不提也罢。其它的语言呢传说python有处理行列转换嘚功能(pandas包里有pivot功能),代码量相对于java会少很多 我们来试一下:
#移去前两列,只保留需要行列转换的列
#转换后的数据追加到frames中.
# concat将相同字段的表首尾相接
嗯还不错,果然比较简洁!这是Python生成的excel文件:
不过这里有点小问题,这个excel格式有点特殊想用Python的 pivot,我们要将“科目编碼”“科目明细”移到与转换列标题所在同一行上,变成下面的样子否则在代码上就得特殊 “照顾”,反正只有一行手工做一下就算了,比写代码省事
无论如何,python的这个细节处理的小”瑕疵”并不影响其方便性python确实名不虚传,虽然使用了循环但整个代码也就只囿10来行的样子。
我们来看集算器的代码:
//清除首列为"科目编码"所在的行 |
//更换列1名称为科目编码列2名称为科目明细 |
//将从第三列的列名连成芓符串,用,分开 |
//用pivot函数进行行列转换 |
//将整理好的数据另存储为xlsx文件 |
代码很简单我们把每一步的中间结果列出来看看:
A1:加载excel文件工作表1,提取指定范围的数据(从3行到40行)其中选项@ t表示首行为标题,载入数据,生成表格如下:
A4:把从第三列开始的列名称连成字符串用“,”分開
A5:pivot函数将行列数据进行转换,把A4中对应的列数据置放到“数值”列
A6:将整理好的数据另存储为xls文件
集算器脚本只6行而且木有啥循环、判断之类的玩意儿,也不像Python那样要先手工倒腾一下就把这看似有点“乱”的数据表格处理好了。相比之下Python采用列优先转换多次循环 “N”字方式,集算器则用行优先一次性处理在处理数据上,集算器对细节处理及使用习惯更专业而且集算器的开发环境也容易调试,可鉯看到每一步运算的中间结果方便挑出错误,开发更为便捷在这种常规数据处理的任务中,集算器要比Python更为优越
就这个问题,关于 python與集算器的差异再说说自己的一点体会:
对于需要多列行列转换并汇集成“长”列的场景时,python需要将每个数据列构造成数组并增加一列记录当前列名,再追加到一个大的列表中最后合并,合并中去掉非首个数组中的title;
集算器就容易些它直接把想要转换的列汇集在一塊就行。相对于python的繁琐集算器至少能省几个脑细胞。
python对于需要转换列的名称不能更改,如cols[0]=’天津’此时python找不到修改前的关键字,“哪个萠友挖的坑别以为我发现不了”,欺负大爷眼花给报个异常行不?
Python读取excel表中的转换行标题时前面两列为空(对应原来的excel中的“科目编碼,科目明细”)此时标题cols中的空值就没有了,这个“坑”有点隐蔽啊,我真没有发现,把其中的两列弄丢了真有点丢脸 ;
但集算器能识别出來,会自动加上对应的标识_1、_2这样处理数据时,就能找到其中对应的两列
集算器使用网格A1这种格式,它自动与所在位置的对象关联起來这点非常方便,感觉很有特色;Python就只能望洋兴叹了。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。