日常生活中,不免俗的都會有需要整理大量資料的需求,而最常用的文書軟體就是Excel,這時候該如何有效讀取Excel檔中的資料,進行額外的整理及操作呢?
本文將以政府開放資料平台-歷年國內主要觀光遊憩據點遊客人數月別統計的資料內容為例,利用Python的Pandas套件,來和大家分享實務上最常見的Excel讀取操作,藉此來提升資料處理的效率。
其中的重點包含:- Pandas讀取Excel資料
- Pandas讀取Excel欄資料
- Pandas讀取Excel列資料
- Pandas讀取Excel儲存格資料
- Pandas合併Excel資料
一、Pandas讀取Excel資料
在開始本文的實作前,在桌面建立一個專案資料夾,接著,到政府開放資料平台-歷年國內主要觀光遊憩據點遊客人數月別統計網站,將下載的CSV檔案,另存為Excel檔案,並且「放置在專案資料夾中」,資料內容擷取部分如下:
可以看到目前只有一個工作表(Sheet),包含主要觀光景點歷年每個月的遊客人數。接下來,利用以下指令安裝Python的Pandas套件及操作Excel的相依性套件openpyxl:
$ pip install pandas $ pip install openpyxl
安裝完成後,建立demo.py檔案,引用Pandas模組(Module),如下範例:
import pandas as pd
而要利用Pandas模組(Module)讀取Excel檔案的資料,可以利用read_excel()方法(Method),如下範例:
import pandas as pd df = pd.read_excel("歷年國內主要觀光遊憩據點遊客人數月別統計.xlsx") print(df)
執行結果
在read_excel()方法(Method)的第一個參數,就是傳入Excel檔案的路徑,由於本文放置在專案資料夾中,屬於同一層目錄,所以只要傳入檔名即可。
除此之外,如果Excel檔中有多個工作表(sheet),想要一次進行讀取的話,該如何達成呢?這邊為了展示多個工作表(sheet)的讀取,筆者新增兩個工作表(sheet),分別將原資料內容的2019年及2018年資料填入,擷取部分如下:
這時候,就需要在read_excel()方法(Method)中,指定sheet_name關鍵字參數為None,Pandas模組(Module)就會讀取多個工作表(sheet)內容,並且組成字典(Dictionary)的型態,否則預設僅會讀取第一個工作表(sheet),如下範例:
import pandas as pd df = pd.read_excel("歷年國內主要觀光遊憩據點遊客人數月別統計.xlsx", sheet_name=None) print(df)
執行結果
當只需要讀取特定的工作表(sheet),大家應該就知道怎麼做了吧,就是在sheet_name關鍵字參數的地方進行指定,如果有一個以上的話,組成串列(List)即可,如下範例:
import pandas as pd df = pd.read_excel("歷年國內主要觀光遊憩據點遊客人數月別統計.xlsx", sheet_name="2019") # df = pd.read_excel("歷年國內主要觀光遊憩據點遊客人數月別統計.xlsx", sheet_name=["2018", "2019"]) print(df)
執行結果
二、Pandas讀取Excel欄資料
瞭解Pandas模組(Module)讀取工作表(sheet)的資料後,接下來,對於其中的內容讀取,主要可分為欄(column)、列(row)及儲存格(cell)資料。
首先,Pandas模組(Module)想要讀取工作表(sheet)中,某些欄位(column)的資料內容,可以使用usecols關鍵字參數來指定所要選取的「欄位標題」、「索引值」或「欄位名稱」,如下範例:
import pandas as pd # 指定欄位標題 df = pd.read_excel("歷年國內主要觀光遊憩據點遊客人數月別統計.xlsx", sheet_name="2019", usecols=["年別", "細分", "合計"]) # 指定欄位索引值 # df = pd.read_excel("歷年國內主要觀光遊憩據點遊客人數月別統計.xlsx", # sheet_name="2019", # usecols=[0, 3, 17]) # 指定欄位名稱 # df = pd.read_excel("歷年國內主要觀光遊憩據點遊客人數月別統計.xlsx", # sheet_name="2019", # usecols="A, D, R") print(df)
執行結果
而如果有多個欄位,不想要一個一個指定的話,也可以使用Pandas模組(Module)的範圍選取欄位(column)方式,如下範例:
import pandas as pd # 選取範圍欄位名稱 df = pd.read_excel("歷年國內主要觀光遊憩據點遊客人數月別統計.xlsx", sheet_name="2019", usecols="A, D, F:R") print(df)
執行結果
以上範例,除了選取A及D欄位外,利用「:」符號範圍選取F到R欄位的資料內容。
三、Pandas讀取Excel列資料
有時Excel檔案的資料量過於龐大,在Pandas模組(Module)讀取的時候可以利用nrows關鍵字參數,來指定所要讀取的列(row)數量,如下範例:
import pandas as pd # 讀取前20列資料 df = pd.read_excel("歷年國內主要觀光遊憩據點遊客人數月別統計.xlsx", sheet_name="2019", nrows=21) print(df)
執行結果
而想要選取Excel檔中,特定列(row)的資料時,可以利用Pandas模組(Module)的read_excel()方法(Method)讀取資料內容後,使用Pandas DataFrame的「[]」符號來範圍選取所需的列(row)資料,如下範例:
import pandas as pd # 讀取2012年的列資料 df = pd.read_excel("歷年國內主要觀光遊憩據點遊客人數月別統計.xlsx") new_df = df[0:287] # 索引值0~286的列資料 print(new_df)
執行結果
以上範例假設要選取Excel檔中,原工作表(sheet)中的2012年資料,所以在第4行完成讀取資料內容後,再來進行列(row)資料的選取。要特別注意的是,「[]」符號中所傳入的是列(row)索引值,從欄位標題之下0開始計算。
四、Pandas讀取Excel儲存格資料
同樣先利用Pandas模組(Module)的read_excel()方法(Method)讀取Excel的資料內容後,使用at或iat屬性(Property)來進行儲存格的定位,詳細的觀念可以參考[Pandas教學]資料分析必懂的Pandas DataFrame處理雙維度資料方法文章,如下範例:
import pandas as pd df = pd.read_excel("歷年國內主要觀光遊憩據點遊客人數月別統計.xlsx") d2 = df.at[0, "細分"] # 讀取D2儲存格的值(以列索引值及欄位標題來定位) # d2 = df.iat[0, 3] # 讀取D2儲存格的值(以列索引值及欄索引值來定位) print(d2) #陽明山遊客中心
五、Pandas合併Excel資料
如果想要合併多個工作表(sheet)的資料,則可以依照以下的步驟來達成:
- 建立一個空的Pandas DataFrame,用來存放合併Excel資料的結果。
- 利用Pandas模組(Module)的read_excel()方法(Method)讀取所有的工作表(sheet)。
- 利用Pandas模組(Module)的ExcelFile方法(Method)取得所有的工作表(sheet)名稱。
- 透過迴圈及get()方法(Method),讀取個別的工作表(sheet)資料,利用Pandas的concat()方法(Method)進行合併,如下範例:
import pandas as pd df = pd.DataFrame() data = pd.read_excel("歷年國內主要觀光遊憩據點遊客人數月別統計.xlsx", sheet_name=None) sheet = pd.ExcelFile("歷年國內主要觀光遊憩據點遊客人數月別統計.xlsx") for s_name in sheet.sheet_names: df = pd.concat([df, data.get(s_name)], ignore_index=False) print(df)
執行結果
六、小結
本文利用政府開放資料平台-歷年國內主要觀光遊憩據點遊客人數月別統計資料為例,來簡單介紹如何利用Pandas套件來讀取Excel檔案中的資料,分別有工作表(sheet)、欄資料(column)、列資料(row)及儲存格資料(cell),並且將讀取到的Excel資料進行合併,如此即能有效的使用這些資料,進行更多的應用。
至於如何利用Pandas套件,將取得的資料寫入Excel檔案,可以參考解析Python網頁爬蟲如何有效整合Pandas套件提升資料處理效率文章,希望對大家有所幫助。如果有其它想要瞭解的Pandas套件應用,歡迎在底下留言讓我知道唷 :)
留言
張貼留言