问题描述

在工作中时常会遇到对 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:excelpandas.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:excelpandas_n.xlsx', sheet_name='科目明细')

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

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

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

还能更简单吗?

嘿嘿,能!

方法 3:集算器编程

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

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

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找到对应数据的列指标_Excel 行列转换的最简方法相关推荐

  1. excel找到对应数据的列指标_三种方式制作数据地图

    数据地图,因为地理信息的加持,信息丰富,直观明显,广泛地应用于多个行业,数据分析必备利器. 方式一:通过Excel制作数据地图 本文大篇幅在介绍这种方式的具体操作方法,共分为四个步骤.概括来说其主要通 ...

  2. excel删除重复数据保留一条_Excel怎么快速查找和删除重复数据

    我们用excel表格记录了大量的数据,当要做数据整理时候发现很多重复数据,那么怎么筛选删除呢? ---------------------------------------------------- ...

  3. excel删除重复数据保留一条_Excel一键删除重复数据,你居然还用逐条排查?

    平时用Excel表格处理大量数据的时候,总会遇到大量的重复无效数据. 如果只有几十条数据,也就罢了,一条一条比对,很快也能清理完,可是如果数据多达上百条,甚至成千上万条,还是去一条一条筛选,那得排查到 ...

  4. Excel表格让某一行/列总是停留在显示页面内的方法(冻结窗格)

    我们在使用Excel表格进行统计工作时,下拉表格后就会导致表头被隐藏,不方便观察哪一列代表的是什么意思,我们可以通过冻结窗格来解决这个问题,具体方法非常简单,如下: 打开Excel表格,选中要冻结的窗 ...

  5. java excel 设置行高 jxi_win7系统下excel2007批量设置行高、列宽、行列间距的方法...

    本小编分享win7系统下excel2007批量设置行高.列宽.行列间距的方法,现在越来越多办公人员使用excel编辑表格数据,有时候需要调节行列间距,及设置行高和列宽,使得我们制作的excel表格看起 ...

  6. 数据透视表sql:用SQL行列转换实现数据透视的一些思考

    用SQL行列转换实现数据透视的一些思考 摘要:根据对报表开发过程中碰到的需要用SQL行列转换进行解决的一类查询统计问题的分析,逐步探索求解得到一种较通用的解决思路,并用函数进行实现.该解决思路及函数实 ...

  7. java行列转置_行列转换之列不固定

    之前写过一篇文章是专门说明对于固定列如何进行行列转换,也就是说最终期望的结果集的列是固定,例如期望的结果是各个城市一年之中每个月的经济量,这个很好做,按照我之前写的文章操作即可.现在有种情况就是期望的 ...

  8. python3实现excel根据条件找到目标数据所在单元格的行数和列数,并插入批注

    问题 根据水果名称和城市,将表格2中的订单号插入到表格1中的批注中去. 表格2如下 表格1如下 解决方法 from openpyxl import Workbook from openpyxl.com ...

  9. excel多列合并成一列加符号_Excel中如何将每行空格数据隔开为多列,以及如何合并多列数据为一列...

    投稿/科研合作:daixjdoctor@126.com 联系我们:137704924或372699348 群1-5:科研讨论.文献汇报群 网站:http://www.sleep-brain.com/ ...

  10. 如何用python计算excel两行之间的差值_excel表格求两列数据差值-怎样在EXCEL表格中求两列数的差?...

    怎样在EXCEL表格中求两列数的差? 1.双击打开需行求差的Excel表格,Excel表格. 2.在进入Excel表格后,使用鼠标需差的单元格,先选中其中一行即可. 3.在选中一行后,在单元格内输入& ...

最新文章

  1. Java中判断String对象是否为空的方法
  2. 【NLP】文本预处理:删除单词停用词
  3. 真正意义的Anchor-Free,FCOS目标检测算法了解一下
  4. Permute Digits
  5. python交互模式切换_Python 交互式窗口 (REPL) - Visual Studio | Microsoft Docs
  6. Flask爱家租房--订单支付(支付过程)
  7. 北工大计算机网络基础期末考试,2013北工大计算机网络应用复习提纲整理版.doc...
  8. C#.net实现密码加密算法的语句
  9. 《深度学习》李宏毅 -- task5网络技巧设计
  10. rl滤波器原理_浅谈滤波器原理以及其他基础知识
  11. 高效维持网络长连接:手把手教你实现 自适应的心跳保活机制
  12. 统计通话次数和时间的软件_通话时间统计app下载-通话时间统计安卓版 v2.2.2 - 安下载...
  13. CentOS mysql常用命令
  14. 2018年第九届蓝桥杯决赛JAVA B 题解(全)
  15. 不能将下载行为传输到IDM(亲测有效)
  16. 用python解“计算工资”题
  17. 用Python爬虫爬取链家网上的房源信息
  18. JointDNN: An Effificient Training and Inference Engine for Intelligent Mobile Cloud Computing Servic
  19. discourse 安装_如何使用Discourse在半天之内建立内部团队论坛
  20. 英魂之刃后台用Java,《英魂之刃》系统操作说明

热门文章

  1. hexdec() 函数
  2. swustoj 143 汉诺塔
  3. 对不起,学会这些 Linux 知识后,我有点飘
  4. 个人网站可以申请微信授权登录吗?
  5. Python语言程序设计基础_答案_前言_通识教育必修课程_上海师范大学
  6. https开头的网址是什么意思_网址是什么意思?基础知识普及
  7. 春节假期 | 最强抢票攻略
  8. 使用office tool plus清除office激活状态
  9. .Net面试经验总结
  10. 三星手机tf卡数据恢复怎么做