前几天,因为一些缘故,需要处理一个包含大量数据的Excel表格。要求具体是将如下表格中的"一""二"列变为"开始"列,"三""四"列变为"结束"列。如下表:
当然,数据少的时候我们可以选择直接使用粘贴复制的手法,但如果数据上千上万呢?这个时候就是咱们写的Python小代码上线的时候啦。
那么,首先,思路:
1、按行取出Excel内所有数据。
2、"一""二"变为一列,"三""四"变为一列。并取到"姓名""性别"两列。
3、"姓名"列必须从['张三','小红']变为['张三','张三','小红','小红']
"性别"列也同样。
4、创建一个表头列表listh,将以上得到的list00,list11,liststart,listend这四个列表存入一个大列表dataz中,每个列表代表一列。
5、将dataz与listh存入Excel中。
6、运用函数及运行程序
全部代码如下:
"""功能:多列转多行作者:橙稚"""import pandas as pdimport openpyxlimport numpy as npdef 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表格不存在,存在的话就手动删掉吧。不然可能会报错的。
④根据不同的需求需要更改的地方都用红框圈下来啦。主要集中在二三四步骤内。