前幾天,因為一些緣故,需要處理一個包含大量數據的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表格不存在,存在的話就手動刪掉吧。不然可能會報錯的。
④根據不同的需求需要更改的地方都用紅框圈下來啦。主要集中在二三四步驟內。
最后:
歡迎關注公眾號尋船人,后台回復“列轉行”獲取代碼及小例子。更多簡便小工具小方法橙子都會在公眾號分享。一起來尋找更簡便的方法吧。