excel怎么把一列数据移动到另一列右边(如何对Excel的列快速移动或对调?四种方法给你一点解决问题的灵感)

wufei123 发布于 2023-12-23 阅读(351)

我整理了Python操作Excel的各部分知识,如果想了解前面完整了解如何操作openpyxl,请参考:如何对Excel的列快速移动或对调?四种方法给你一点解决问题的灵感如何用Python操作Excel自动化办公?一个案例教会你openpyxl——读取数据

如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理如何用Python操作Excel自动化办公?一个案例教会你openpyxl——样式和条件格式如何用Python操作Excel自动化办公?一个案例教会你openpyxl——图表设计和透视表

工作中遇到关于excel的一个小小的问题,如下有32行71列数据,现在需要对71个列进行对调,如果是你,你会怎么解决?如果一列一列拖动,可以解决问题但是工作量大容易出错,所以得想个简便的方法因为列标题恰好是日期,可以通过排序的方式对调,不过好像只有行排序,没有对列进行排序的功能菜单。

那怎么办呢?原数据(图一):

预期效果(图二):

思路一:Excel转置+排序玩excel很溜的朋友应该能很快想到办法,我可以通过对数据复制、转置粘贴、排序,再复制、转置粘贴,不就好了么?思路是对的,我们来实现一下1.将图一表的sheet1中的原数据复制,再转置粘贴到sheet2:。

2.对sheet2"时间“列升序排序:

3.将sheet2中的原数据复制,再转置粘贴到sheet3,得到图二这样就完成了上面效果啦,是不是相比手动一列一列拖动简单的多呢?看到这里可能大家会吐槽这有什么用?太简单了实际上我想提供的是解决这么个小小问题的一些思路想法。

如果这个数据量再大一点(比如一千行一前列)呢?两次复制粘贴会不会占用空间和时间(你试试会不会卡的要死)?我们可以用PowerBI来不用复制粘贴就实现转置+排序思路二:PowerBI转置+反转行1.导入数据,然后点转置:

2.点击反转行(它专门有个“反转行”的功能):

3. 再次转置:

4. 最后一步,移动最后一列到第一列(因为反转行把“时间”列给调换到后面去了):

可以看到PowerBI的好处是不需要复制粘贴,只需要几次点击就可以完成目的而且它解决了如果不是可以排列的日期格式数据,也可以通过反转行进行快速排列在更多数据和非日期数据方面,是不是PowerBI更方便?。

然而这样还不够,咱们这个问题是解决了,如果问题的条件又发生变化,比如我需要前三十列对调,后三十列对调,你该怎么解决呢?用上面的方法把数据拆分再合并也可以达到目的但是如果你会使用Python,就能更加灵活的解决这类问题。

思路三:Openpyxl正向导入,反向输出1. 导入库和数据#load_workbook库是专门用来导入excel文件的库 from openpyxl import load_workbook #get_column_letter库是用将数字格式单元格地址转换为字母形式 from openpyxl.utils import get_column_letter wb = load_workbook(r"D:\Datalu\testdata\2021CPI.xlsx") #获取Sheet1的数据 ws = wb[Sheet1]

2. 将导入的数据写入一个嵌套列表中:total_list = [] #从第一列第一行自上往下到第一列最后一行,再第二列第一行自上往下到第二列最后一行,以此类推,竖着遍历 for r in range(1, ws.max_column + 1): row_list = [] # 每一列建立一个小list for c in range(1, ws.max_row + 1): v = ws.cell(c, r).value #获取每个遍历到的单元格的值 row_list.append(v) #把每一列每个单元格的值append到列表中 total_list.append(row_list) #再把每一列数据组成的列表append到大列表total_list中 print(total_list) #打印列表

3. 将列表反转对调,再写入到sheet2中:

这样我们就实现了对71个列的对调,但是却把原本的第一列调换到最后一列去了,所以还得再放回来:4.把“时间”列移动到第一列:

虽然是解决了问题,但是使用了二十三行代码,非常繁琐,如果对python/openpyxl库不熟悉的话可能都懒得用不过这个好处是什么呢?就在于如果你学会使用openpyxl这个库的语法,你就可以定制绝大部分想实现的Excel的功能,你第一次解决一个问题写代码时比较麻烦,但是解决同类问题只需要改动小小部分就可以实现,而其他工具可能就变得麻烦了;还有个好处是代码一次写成,多次复用,效率大大提高。

还有没有更好方法呢?有!思路四:pandas列标题对调#导入数据和库 import pandas as pd df = pd.read_excel(r"D:\Datalu\testdata\2021CPI1.xlsx") #获取列名的列表 temp = list(df.columns) #跟上面的思路一样,把列表对调 temp.reverse() #把调换到最后一列的“时间”列用列表的拼接功能放到第一列 temp2 = temp[-1:]+temp[:-2] # 生成新的数据表df2 df2 = df[temp2] df2.to_excel(test3.xlsx,index=False)

看!六行代码搞定,既不需要你复制粘贴,也不需要反复点点点,还不需要写那么多代码,如果问题发生变动只需要改动部分代码,如果数据不能排序也可以使用列表切片的办法随便调换是不是鲁棒性更强了呢?把这个小问题复杂化其实也是想将复杂问题简单化,如果你知道解决问题的本质思路,你也了解多种工具,就可以综合多种情况快速解决问题而不会怼着一个工具绕圈子。

另外也可以看出,Excel和BI等处理数据的能力很强大,它把绝大部分处理数据的过程都简化成小步骤,通过组合就能实现很多目的,但它限于软件的框架而有局限性,比如数据量小、缺乏程序化;而Python等编程工具的DIY程度就比较高,你可以利用它的语法读写Excel,快速反复调用,而不需要手动重复,所以我比较喜欢用Python来操作Excel实现数据分析和办公自动化。

最后欢迎大家关注我,我是拾陆,了解“二八Data”,更多技术干货持续奉献。

亲爱的读者们,感谢您花时间阅读本文。如果您对本文有任何疑问或建议,请随时联系我。我非常乐意与您交流。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。