Pandas.DataFrame之入門九道題目–處理從html讀取的表格

JN想標題很久,想不對甚麼會很貼切,於是勉強這樣下。
 
關於Python的Pandas教學,從Google搜尋就能找到許多中國的解說。不過每次JN想要做的處理,就要再次尋找相關教學,因為分散在各地,實在很麻煩又不容易學習。而且內容詳盡的教學網站都類似教科書一樣死板呈現,然而想學的地方就只是千段中的一段文字,並不能很有效就挖掘出來。JN僅推薦從「pandas 0.22.0 documentation」去尋找如何做你想要的操作。
這篇文章是以網路爬蟲的會用到「Pandas.DataFrame」的一些處理為編寫依據,也是從實戰中有做的處理。JN相信,只要能完成這九道題目,就能整理大多數從網頁讀取的表格。歡迎分享解題過程在下方留言,而JN有天也會補上自己的寫法(可能吧)。

規則:使用「pandas.read_html()」讀取html檔案,找出左欄的表格,並且左欄表格進行整理,最後整理成右欄表格的樣式。下載html表格(dropbox)

表格來源

目標

A. 整齊表格
小明 小華 小美 小倩
鉛筆 1 2 3 4
橡皮擦 5 6 7 8
直尺 9 10 11 12
A1. 各列為一串列(list)
銷售員 = [“小明”, “小華”, “小美”, “小倩”]
鉛筆 = [1, 2, 3, 4]
橡皮擦 = [5, 6, 7, 8]
直尺 = [9, 10, 11, 12]
A2. 轉置表格(DataFrame)
鉛筆 橡皮擦 直尺
小明 1 5 9
小華 2 6 10
小美 3 7 11
小倩 4 8 12
B. 項目歪曲的表格
小明 小華 小美 小倩
鉛筆 1 2 3 4
橡皮擦 5 6 7 8
直尺 9 10 11 12
B. 修復表格(DataFrame)
小明 小華 小美 小倩
鉛筆 1 2 3 4
橡皮擦 5 6 7 8
直尺 9 10 11 12
C. 有非NaN類缺值的表格
小明 小華 小美 小倩
鉛筆 2 3
橡皮擦 5 6 7 8
直尺 9 10 11 12
C.去掉缺值列(DataFrame)
小明 小華 小美 小倩
橡皮擦 5 6 7 8
直尺 9 10 11 12
D. 表格鑲表格
a
b
j
D 小明 小華 小美 小倩
鉛筆 1 2 3 4
橡皮擦 5 6 7 8
直尺 9 10 11 12
D. 小美小倩的橡皮擦與直尺的銷售狀況(DataFrame)
小美 小倩
橡皮擦 7 8
直尺 11 12
E. 有合併欄位的表格
銷售數據
男生
女生
小明 小華 小美 小倩
鉛筆 1 2 3 4
橡皮擦 5 6 7 8
直尺 9 10 11 12
E. 簡化表格(DataFrame)
小明 小華 小美 小倩
鉛筆 1 2 3 4
橡皮擦 5 6 7 8
直尺 9 10 11 12
F. 同類的兩個表格
鉛筆 橡皮擦 直尺
小明 1 5 9
小華 2 6 10
鉛筆 橡皮擦 直尺
小美 3 7 11
小倩 4 8 12
F1. 分別加入”性別”欄位(DataFrame)
性別 鉛筆 橡皮擦 直尺
小明 1 5 9
小華 2 6 10
性別 鉛筆 橡皮擦 直尺
小美 3 7 11
小倩 4 8 12
F2. 合併F1的兩表格(DataFrame) ※性別”女”的表格在上方
性別 鉛筆 橡皮擦 直尺
小美 3 7 11
小倩 4 8 12
小明 1 5 9
小華 2 6 10
F3. 從A2表開始,分離後再進行F1、F2(全程DataFrame)
A2 鉛筆 橡皮擦 直尺
小明 1 5 9
小華 2 6 10
小美 3 7 11
小倩 4 8 12

JN的小訣竅:

A1:使用「pandas.DataFrame.to_csv()」把DF(DataFrame)轉換成csv格式(str),並逐列整理成「list」。
B:創立新的DF,逐欄(df.loc())轉移到新DF。

C:用「.replace(“-“, pandas.np.NaN).dropna(axis=0,how=’any’) 」,先把「”-“」替換成「NaN」,再用「df.dropna()」即可丟掉缺失值。
D:找出內層

,再用「df.loc()」框出所需範圍並複製(.copy())成新的DF。

E:如B。
F1:使用「df.insert()」,在索引1的欄位先插入性別,即「df.insert(1,”性別”, “”)」,之後再統一該欄位的值,即「df[‘性別’] = “男” or “女”」。
F2:用「df.drop()」丟棄男表格的第一列(為:性別, 鉛筆……),再用「df.concat()」合併女表格與男表格。
F3:如D,先切割成男、女表格,即兩新DF。但因為來源DF的index也一同被複製,所以用「df.reset_index()」重置列的編號,再用「del df[‘index’]」刪除舊的index欄。之後如F1、F2步驟。