做者: Erik Marsjahtml
翻譯:老齊正則表達式
與本文相關的圖書推薦:《數據準備和特徵工程》,本書已經在【電子工業出版社天貓旗艦店】發售bash
本文,咱們將經過幾步演示如何用Pandas的read_html
函數從HTML頁面中抓取數據。首先,一個簡單的示例,咱們將用Pandas從字符串中讀入HTML;而後,咱們將用一些示例,說明如何從Wikipedia的頁面中讀取數據。markdown
對於數據分析和可視化而言,咱們一般都要載入數據,通常是從已有的文件中導入,好比常見的CSV文件或者Excel文件。從CSV文件中讀入數據,可使用Pandas的read_csv
方法。例如:網絡
import pandas as pd df = pd.read_csv('CSVFILE.csv') 複製代碼
上面的方法一般用於導入結構化的數據,好比CSV或者JSON等。app
咱們平時更多使用維基百科的信息,它們一般是以HTML的表格形式存在。函數
爲了得到這些表格中的數據,咱們能夠將它們複製粘貼到電子表格中,而後用Pandas的read_excel
讀取。這樣固然能夠,然而如今,咱們要用網絡爬蟲的技術自動完成數據讀取。oop
用Pandas讀取HTML表格數據,固然要先安裝Pandas了。此處使用pip來安裝(也可使用其它方式,好比Anaconda, ActivePython等),安裝方法pip install pandas
。學習
注意,若是執行此命令後會自動檢查pip是否須要升級,若是有必要請升級。此外,咱們也會使用lxml或者BeautifulSoup4這些包,安裝方法仍是用pip:pip install lxml
。spa
read_html
函數使用Pandas的read_html
從HTML的表格中讀取數據,其語法很簡單:
pd.read_html('URL_ADDRESS_or_HTML_FILE') 複製代碼
以上就是read_html
函數的完整使用方法,下面演示示例:
第一個示例,演示如何使用Pandas的read_html
函數,咱們要從一個字符串中的HTML表格讀取數據。
import pandas as pd html = '''<table> <tr> <th>a</th> <th>b</th> <th>c</th> <th>d</th> </tr> <tr> <td>1</td> <td>2</td> <td>3</td> <td>4</td> </tr> <tr> <td>5</td> <td>6</td> <td>7</td> <td>8</td> </tr> </table>''' df = pd.read_html(html) 複製代碼
如今,咱們所獲得的結果不是Pandas的DataFrame對象,而是一個Python列表對象,可使用tupe()
函數檢驗一下:
type(df) 複製代碼
在第二個示例中,咱們要從維基百科中抓取數據。咱們要抓取的是關於蟒科的表格數據。
import pandas as pd dfs = pd.read_html('https://en.wikipedia.org/wiki/Pythonidae') 複製代碼
如今,咱們獲得了一個包含7個表格的列表(len(df)
),若是打開維基百科的那個網頁,咱們可以看到第一個表格是頁面右邊的,在本例中,咱們更關心的是第二個表格:
dfs[1]
複製代碼
在第三個示例中,咱們要讀取瑞典的新冠病毒(covid-19)數據。此處,須要在read_html
方法中增長一個參數,而後實施數據清洗,最後要對這些數據進行可視化。
打開網頁,會看到頁面中的表格上寫着「New COVID-19 cases in Sweden by county」,如今,咱們就使用match參數和這個字符串:
dfs = pd.read_html('https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_Sweden', match='New COVID-19 cases in Sweden by county') dfs[0].tail() 複製代碼
用這個方法,咱們僅獲得了網頁上的表格,可是,如圖中所示,倒數三行是沒用的,須要刪除它們。
iloc
刪除最後幾行下面,使用Pandas的iloc刪除最後三行。注意,咱們使用-3做爲第二個參數(若是對此不理解,請參考Pandas有關教程,好比《跟老齊學Python:數據分析》),最後再複製一份數據。
df = dfs[0].iloc[:-3, :].copy()
複製代碼
接下來,要學習如何將多級列索引改成一級索引。
如今,咱們要處理多級列索引問題了,準備使用DataFrame.columns
和DataFrame.columns,get_level_values()
:
df.columns = df.columns.get_level_values(1)
複製代碼
最後,如你所見,在「Date」那一列,咱們用read_html
從維基百科網頁的表格中得到數據以後,還有一些說明,接下來使用str.replace
函數和正則表達式對其進行修訂:
df['Date'] = df['Date'].str.replace(r"\[.*?\]","") 複製代碼
set_index
更改索引咱們繼續使用Pandas的set_index
方法將日期列設置爲索引,這樣作可以爲後面的做圖提供一個時間類型的Series對象。
df['Date'] = pd.to_datetime(df['Date']) df.set_index('Date', inplace=True) 複製代碼
爲了後續的做圖須要,咱們須要用0填充缺失值,而後將相應列的數據類型改成數字類型。爲此,使用apply
方法。最後,使用cumsum()
方法獲得每一列的逐項求和的值。
df.fillna(0, inplace=True)
df = df.iloc[:,0:21].apply(pd.to_numeric)
df = df.cumsum()
複製代碼
最後一部分,使用read_html
所獲得的數據,建立一個時間序列的圖像。首先,要導入matplotlib,能夠用legend函數定義圖例的位置。
%matplotlib inline import matplotlib.pyplot as plt f = plt.figure() plt.title('Covid cases Sweden', color='black') df.iloc[:,0:21].plot(ax=f.gca()) plt.legend(loc='center left', bbox_to_anchor=(1.0, 0.5))) 複製代碼
本文中,學習了用Pandas的read_html
函數從HTML中讀取數據的方法,而且,咱們利用維基百科中的數據建立了一個含有時間序列的圖像。不只如此,最後還將「Date」列設置爲DataFrame的索引。
原文連接:www.marsja.se/how-to-use-…
搜索技術問答的公衆號:老齊教室
在公衆號中回覆:老齊,可查看全部文章、書籍、課程。
以爲好看,就點贊和轉發