1. 程式人生 > 其它 >python怎樣按某一列值拆分Excel表格

python怎樣按某一列值拆分Excel表格

技術標籤:pythonpython

[email protected]

用python按某一列拆分Excel工作表,將內容寫入一個工作簿

本次以“按照表中的某一列,將一張表格拆分為多張表”的需求為例,簡單介紹這個過程中用到的pd.ExcelWriter,及每一句的作用。

表
如上表《學生.xlsx》,假設有14萬行28列,請按照學校名,拆分表格(不想用複製貼上)。

writer = pd.ExcelWriter(out_worksheet)

writer物件的一大作用:讓資料可以以工作表的分隔方式,不間斷地寫入工作簿,即得到一個包含多張工作表的工作簿。如果不用它,而是直接指定工作簿的路徑,那麼即使有迴圈,最終得到的結果還是隻包含一個工作表的工作簿。

程式碼及解釋如下

import pandas as pd
from time import time#用來計算時間,展示進度,減少焦慮

in_ws='學生.xlsx'#給出要拆的表名
out_ws='學生-按學校拆分結果.xlsx'#給出結果工作簿的名稱
lie_name='學校'#給出拆分依據的列名

#以上,引數給好了,下面開始拆
start_time=time()#記住開始時間
# ~~~~~~~~~這裡路徑按自己的需求改,我目前將表放在桌面~~~~~~~~~
file='C:/Users/wowowo/Desktop/'+in_ws
sheet_df = pd.read_excel(file
,names=None)#用pandas讀取表格內容(有時候會需要加一個引數:encoding="utf-8") # print(sheet_df.head())#可以檢視資料是否讀進來了,有無偏差 out_worksheet = 'C:/Users/wowowo/Desktop/' + out_ws writer = pd.ExcelWriter(out_worksheet) #這一句的作用是:建立一個工作簿物件,後面to_excel()要用到這個物件writer; #如果你列印writer,得到的答案是:<pandas.io.excel._xlsxwriter._XlsxWriter object at 0x00000000027B0FA0>;
#插一句:這個工作簿物件writer有save()和close()方法,在寫完資料後,要呼叫二者 #好像是隻用save()就可以了,一旦用了save(),工作簿就關了,後面的資料就寫不進去了!所以如果有迴圈,save()要寫在迴圈外面 #seve()和close()的相同之處:都會關閉工作簿,從而事實上阻止後面的資料寫入工作簿(即:程式執行不提示錯誤,但是後面的資料沒有寫進工作簿); # 相同之二:save()、close()都只能用一次,如果把save()/close()寫在迴圈裡面,會提示:Calling close() on already closed file. 即:這個檔案現在已經關掉啦,我沒辦法再關一次 separatedDataList = list(sheet_df.groupby([lie_name])) #這一步非常關鍵,直接將待拆的表,按照指定的列分組,然後裝進一個list; #sheet_df.groupby([lie_name])可以將資料按照lie_name(即學校)分組,但是給出的是個物件,並不是實際資料,如果要檢視分組後的資料,目前就是把它list(),然後print(這個list) # 但是注意,列表中的元素都是tuple,如('實驗高中',表格資料blabla [2694rows x 28 columns])的形式,<class 'tuple'>; # 而tuple的元素是兩個str,<class 'str'>,tuple第一個元素的長度是學校名字的長度(如實驗高中則長4),第二個元素的長度是資料行數(如2694行則長2694) for separatedData in separatedDataList: separatedData[1].to_excel(writer, sheet_name=separatedData[0], index=False) now_time = time() used_time = (now_time - start_time) / 60 print(separatedData[0], '已處理', len(separatedData[1]), '行,', '已用時:%.2f' % used_time, '分') writer.save() # writer.close()#save()與close()都可,二選一,但注意,不要寫到for裡面去了 print('the end')

好了。