2018年2月26日 星期一

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


2018.2.26 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. 整齊表格
小明小華小美小倩
鉛筆1234
橡皮擦5678
直尺9101112
A1. 各列為一串列(list)
銷售員 = ["小明", "小華", "小美", "小倩"]
鉛筆 = [1, 2, 3, 4]
橡皮擦 = [5, 6, 7, 8]
直尺 = [9, 10, 11, 12]

A2. 轉置表格(DataFrame)
鉛筆橡皮擦直尺
小明159
小華2610
小美3711
小倩4812
B. 項目歪曲的表格
小明小華小美小倩
鉛筆1234
橡皮擦5678
直尺9101112
B. 修復表格(DataFrame)
小明小華小美小倩
鉛筆1234
橡皮擦5678
直尺9101112
C. 有非NaN類缺值的表格
小明小華小美小倩
鉛筆-23-
橡皮擦5678
直尺9101112
C.去掉缺值列(DataFrame)
小明小華小美小倩
橡皮擦5678
直尺9101112
D. 表格鑲表格
a
b
j
D小明小華小美小倩
鉛筆1234
橡皮擦5678
直尺9101112
D. 小美小倩的橡皮擦與直尺的銷售狀況(DataFrame)
小美小倩
橡皮擦78
直尺1112
E. 有合併欄位的表格
銷售數據
男生
女生
小明小華小美小倩
鉛筆1234
橡皮擦5678
直尺9101112
E. 簡化表格(DataFrame)
小明小華小美小倩
鉛筆1234
橡皮擦5678
直尺9101112
F. 同類的兩個表格
鉛筆橡皮擦直尺
小明159
小華2610
鉛筆橡皮擦直尺
小美3711
小倩4812
F1. 分別加入"性別"欄位(DataFrame)
性別鉛筆橡皮擦直尺
小明159
小華2610
性別鉛筆橡皮擦直尺
小美3711
小倩4812

F2. 合併F1的兩表格(DataFrame) ※性別"女"的表格在上方
性別鉛筆橡皮擦直尺
小美3711
小倩4812
小明159
小華2610

F3. 從A2表開始,分離後再進行F1、F2(全程DataFrame)
A2鉛筆橡皮擦直尺
小明159
小華2610
小美3711
小倩4812


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:找出內層<table>,再用「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步驟。