问题描述

  在工作中时常会遇到对 Excel 表格的处理。当编辑一张 Excel 表格时,发现表格的列数太多,而行数较少,为方便打印,这时你或许会希望将该表格行列转换;或许是为了做进一步做统计分析,当前格式不太方便,这时也会用到行列转换。

  下面这种交叉式的 Excel 表是很常见的格式,用来填写和查看都比较方便:
  

  但是,如果想做进一步的统计分析,这种格式就不方便了,需要行列转换,变成如下格式的明细表:
  

  显然,手工操作会非常麻烦,若数据量小还可以,数据量大了会耗费大量时间,简直就是灾难。

  我们就以此为例,举例说明几种常见的解决方法。

解决方法

方法 1:Excel 数据透视表

  Excel 可以通过数据透视表支持行列转换功能,效果如下图:
  

  显然,这并不是我们想要的格式。Excel 的数据透视表可以满足简单格式的行列转换,但如果格式稍微复杂,转换效果往往是不尽人意。

方法 2:编程语言

  以写程序来解决,思路也很简单:

  · 加载 excel 文件,装载需要的 sheet 工作表。

  · 读取“账套名”所在行,将其转换成字符串数组。

  · 读取“科目编码”所在列,将其转换成字符串数组。

  · 按“科目编码”分组,与“账套名”数组构造一张表。

  · 根据“账套名”对应的数据,遍历所有的明细值填充到相应的表中。

  · 这样就可以构造出对应的明细表来。

  如果用 Java 来实现,初步估计代码量也不会少于 200 行,若需要结果输出成 excel 文件则开发工作量会更多。虽然 Excel 自己提供了 VBA,但那个麻烦程度谁用谁知道,不提也罢。那其它的语言呢?传说 python 有处理行列转换的功能(pandas 包里有 pivot 功能),代码量相对于 java 会少很多, 我们来试一下:

    import pandas as pdimport numpy as npdf = pd.read_excel("D:\\excel\\pandas.xlsx", 0, 3)cols = df.columns.values.tolist() #获取数据头信息#移去前两列,只保留需要行列转换的列cols.remove('科目编码')cols.remove('科目明细')#构造一个 list.frames=[]for col in cols:df1 = df.pivot_table(index = ['科目编码','科目明细'], values = [col])df1.rename(columns={col: '数值'}, inplace=True)df1[3]=col#转换后的数据追加到 frames 中.frames.append(df1)# concat 将相同字段的表首尾相接result=pd.concat(frames)result.rename(columns={3: '帐套名'}, inplace=True)result.to_excel('D:\\excel\\pandas_n.xlsx', sheet_name='科目明细')

  效果还不错,果然比较简洁!这是 Python 生成的 excel 文件:
  

  不过,存在一点小问题,这个 excel 格式有点特殊,想用 Python 的 pivot,我们要将“科目编码”,“科目明细”移到与转换列标题所在同一行上,变成下面的样子。否则在代码上就得特殊 “照顾”,反正只有一行,手工做一下就算了,比写代码省事。
  

  无论如何,python 的这个细节处理的小“瑕疵”并不影响其方便性。python 确实名不虚传,虽然使用了循环,但整个代码也就只有 10 来行的样子。

  还能更简单吗?

  嘿嘿,能!

方法 3:集算器编程

  下面我们来看集算器的代码:

  A B
1 =file("D:/excel/ 明细.xlsx").importxls@t(;1,3:40) // 读入 excel 文件
2 >A1.delete(A1.select(_1=="科目编码")) // 清除首列为“科目编码”所在的行
3 >A1.rename(_1: 科目编码,_2: 科目明细) // 更换列 1 名称为科目编码,列 2 名称为科目明细
4 =A1.fname().to(3,).concat(",") // 将从第 3 列的列名连成字符串,用, 分开
5 =A1.pivot@r(科目编码, 科目明细; 账套名, 数值;${A4}) // 用 pivot 函数进行行列转换
6 =file("D:/excel/ 明细 2.xlsx").exportxls@t(A5;"科目明细") // 将整理好的数据另存储为 xlsx 文件

  代码很简单,我们把每一步的中间结果列出来看看:

  A1:加载 excel 文件工作表 1,提取指定范围的数据 (从 3 行到 40 行),其中选项 @ t 表示首行为标题,载入数据, 生成表格如下:
  

  A2:删除非数据行
  

  A3:更换列名称
  

  A4:把从第 3 列开始的列名称连成字符串,用“,”分开
  

  A5:pivot 函数将行列数据进行转换,把 A4 中对应的列数据置放到“数值”列
  

  A6:将整理好的数据另存储为 xlsx 文件
  

  集算器脚本只有 6 行,木有啥循环、判断之类的玩意儿,也不像 Python 那样要先手工倒腾一下,就把这看似有点“乱”的数据表格处理好了。相比之下,Python 采用列优先转换多次循环 “N”字方式,集算器则用行优先一次性处理,在处理数据上,集算器对细节处理及使用习惯更专业。而且集算器的开发环境也容易调试,可以看到每一步运算的中间结果,方便挑出错误,开发更为便捷。在这种常规数据处理的任务中,集算器要比 Python 更为优越。

优势总结

  就这个问题,关于 python 与集算器的差异,再说说自己的一点心得体会:

1. 多列转换

  对于需要多列行列转换并汇集成“长”列的场景时,python 需要将每个数据列构造成数组,并增加一列记录当前列名,再追加到一个大的列表中,最后合并,合并中去掉非首个数组中的 title;

  集算器就容易些,它直接把想要转换的列汇集在一块就行。相对于 python 的繁琐,集算器至少能省几个脑细胞。

2. 名称更改

  python 对于需要转换列的名称不能更改, 如 cols[0]=’天津’,此时 python 找不到修改前的关键字,“哪个朋友挖的坑,别以为我发现不了”,欺负大爷眼花,给报个异常行不?

  但对应的集算器来说则很方便, 如:>A1.rename(_1: 科目编码,_2: 科目明细,4 成都: 成都)

3. 标题空值问题

  Python 读取 excel 表中的转换行标题时,前面两列为空 (对应原来的 excel 中的“科目编码,科目明细”),此时标题 cols 中的空值就没有了, 这个“坑”有点隐蔽啊,我真没有发现, 把其中的两列弄丢了,真有点丢脸 ;

  但集算器能识别出来,会自动加上对应的标识 _1、_2,这样处理数据时,就能找到其中对应的两列。

4. 网格式编程

  集算器使用网格 A1 这种格式,它自动与所在位置的对象关联起来,这点非常方便, 感觉很有特色;Python 就只能望洋兴叹了。

Excel 行列转换的最简方法相关推荐

  1. oracle行列转换关联union的方式_几行代码轻松玩转 Excel 行列转换

    几行代码轻松玩转 Excel 行列转换 下面这种交叉式的 Excel 表是很常见的格式,用来填写和查看都比较方便: 但是,如果想做进一步的统计分析,这种格式就不方便了,需要行列转换,变成如下格式的明细 ...

  2. mysql行列转换case_浅析SQL语句行列转换的两种方法 case...when与pivot函数的应用_MySQL...

    bitsCN.com /*创建数据库*/ CREATE DATABASE tmp go USE tmp go /*创建数据库测试表*/ CREATE TABLE [Scores] ( [ID] INT ...

  3. mysql pivot函数怎么用_浅析SQL语句行列转换的两种方法 case...when与pivot函数的应用...

    /*创建数据库*/ CREATE DATABASE tmp go USE tmp go /*创建数据库测试表*/ CREATE TABLE [Scores] ( [ID] INT IDENTITY(1 ...

  4. oracle行列互换sql,解决Oracle行列转换问题的一个方法

    不好意思,编译错误,可能是版本的问题 其实,实现的方法很简单,请参考精华帖子 下面是源文件 ,我是的数据库版本是9.2.0.1,OS为NT [PHP] ---Author: Accelerator - ...

  5. Excel行列转置(行数据与列数据的转换)

    Excel行列转换的方法就是选择性粘贴. 将以行形式存储的数据复制后,选中其他空白单元格,右键,选择"选择性粘贴",打开"选择性粘贴"对话框,勾选"转 ...

  6. 把excel转换成html格式的文件,极强PDF转换器将Excel表格转换成HTML网页格式的方法...

    极强PDF转换器如何将Excel表格转换成HTML网页格式?想要转换文件其实很简单,小编告诉大家一个用专业的极强PDF转换器软件将Excel表格转换HTML格式的方法,下面小编就来教大家如何将Exce ...

  7. 怎样将excel表格导入天正_怎样把excel表格转换成cad读取

    在cad设计,为了工作效率,图纸的明细表都会在EXCEL中做好,然后直接导入到哦CAD中使用.那该如何去导入到cad中去呢?下面小编就介绍三种方法. excel表格转换成cad的方法一 1.单击工具栏 ...

  8. excel简繁切换_详细介绍在Excel中将简体转换成为繁体的方法

    繁体字,亦称繁体中文.繁体中文至今已有三千年以上的历史,直到1956年前一直是各地华人中通用的中文标准字.今天就跟着小编一起来看一看:详细介绍在Excel中将简体转换成为繁体的方法. 不知道大家在日常 ...

  9. SQL语句行列转换两种方法 case ...when 和pivot函数应用

    2019独角兽企业重金招聘Python工程师标准>>> SQL语句行列转换两种方法 case ...when 和pivot函数应用SQL语句行列转换两种方法 case ...when ...

  10. 如何将PDF转换成Excel表格?这两种方法超实用

    如今高考分数已公布,各省市的志愿填报也在有序不紊的进行,很多学生或家长都会从网上下载往年各省市或高校的录取分数情况作为参考,但一般下载的都是PDF格式的文档,筛选和查找起来特别不方便,那么如何将PDF ...

最新文章

  1. Runtime.getRuntime().addShutdownHook(new Thread()
  2. Java编程之正则表达式
  3. oracle数值类型--LOB+ROWID/UROWID
  4. OGC之路(1) 之 WMS标准学习总结
  5. 十一届蓝桥杯国赛 美丽的2-枚举
  6. chrome只能装在c盘吗_电脑硬盘使用与文件整理入门——逃离C盘?
  7. jq如何获取选中option的值_【分享】如何获取变量token的值
  8. SpringMVC_04 拦截器 【拦截器的编程步骤】【session复习?】
  9. solr6.6初探之主从同步
  10. hadoop、hbase、hive、spark分布式系统架构原理
  11. 2022年五一数学建模竞赛C题
  12. 百度文库中的文字不能复制,怎么办?
  13. python zookeeper api_zookeeper java api介绍
  14. C51单片机实验-LCD1602显示实验
  15. 信创项目基础软件都包括哪些?你要了解
  16. 计算机网络数据爆分片MTU,踢走绊脚石,MTU解析与常见问题汇总-上篇
  17. Django框架中No installed app with label问题
  18. 基于PHP+MySQL实现注册和登录功能
  19. python 扯线木偶_年轻的50个细节
  20. 关于dvb 基本知识

热门文章

  1. 大数据的75个名词解释
  2. 米兰理工计算机博士申请,意大利博士申请:米兰理工大学16个博士/博士后项目招生中~...
  3. 高中职教学专业计算机,中职计算机专业教学的现状与对策
  4. 2012年最具影响力路由器配置精品文章荟萃【108篇】
  5. 王垠:清华梦的粉碎—写给清华大学的退学申请 2005.9.22
  6. matlab chan算法定位,chan算法定位 matlab
  7. Yalmip:踩坑记录/窍门分享
  8. 发送速率(传输速率)和传播速率
  9. Android签名工具 AndroidMultitool使用方法
  10. 计算机二级常用口诀,2017计算机二级考试重点