前几天,因为一些缘故,需要处理一个包含大量数据的Excel表格。要求具体是将如下表格中的"一""二"列变为"开始"列,"三""四"列变为"结束"列。如下表:
转为
当然,数据少的时候我们可以选择直接使用粘贴复制的手法,但如果数据上千上万呢?这个时候就是咱们写的Python小代码上线的时候啦。
思路:
1、按行取出Excel内所有数据。
2、"一""二"变为一列,"三""四"变为一列。并取到"姓名""性别"两列。
3、"姓名"列必须从[\'张三\',\'小红\']变为[\'张三\',\'张三\',\'小红\',\'小红\']
"性别"列也同样。
4、创建一个表头列表listh,将以上得到的list00,list11,liststart,listend这四个列表存入一个大列表dataz中,每个列表代表一列。
5、将dataz与listh存入Excel中。
6、运用函数及运行程序
全部代码如下:
"""
功能:多列转多行
作者:橙稚
"""
import pandas as pd
import openpyxl
import numpy as np
def data_write(listh, dataz):
file1 = openpyxl.Workbook()
outws = file1.create_sheet(index=0) # 创建sheet
outws.append(listh)
for f in range(len(dataz[0])):
outws.append(dataz[:, f].tolist())
file1.save("text-1.xlsx")
if __name__ == \'__main__\':
df = pd.read_excel(\'test.xlsx\',dtype=object,keep_default_na=False)
data2 = df.values.tolist()
list0=[]
list1=[]
liststart=[]
listend=[]
for i in range(0,len(data2)):
for j in range(2,4):
liststart.append(data2[i][j])
for k in range(4,6):
listend.append(data2[i][k])
list0.append(data2[i][0])
list1.append(data2[i][1])
list00=[]
list11=[]
for i in list0:
for j in range(0,2):
list00.append(i)
for i in list1:
for j in range(0,2):
list11.append(i)
dataz = [list00,list11,liststart,listend]
listh=[\'姓名\',\'性别\',\'开始\',\'结束\']
dataz=np.array(dataz)
data_write(listh,dataz)
需要注意的地方:
①Excel表格中有空白单元格,记得取数据的时候加上keep_default_na=False,不然在存数据的时候空单元格会变成#NAN!
② 在用Python取Excel中int数据的时候,记得要加dtype=object,不然的话取数据的时候自动将int型数据变为float型数据。如3变为3.0。
③每一次运行前一定要确保test-1.xlsx这个Excel表格不存在,存在的话就手动删掉吧。不然可能会报错的。
④根据不同的需求需要更改的地方都用红框圈下来啦。主要集中在二三四步骤内。
最后:
欢迎关注公众号寻船人,后台回复“列转行”获取代码及小例子。更多简便小工具小方法橙子都会在公众号分享。一起来寻找更简便的方法吧。