1. 程式人生 > >最全面的Pandas的教程!沒有之一!

最全面的Pandas的教程!沒有之一!

缺少 輕松 範圍 esc image 標準 view multi scribe

Pandas?是基於?NumPy?的一個開源 Python 庫,它被廣泛用於快速分析數據,以及數據清洗和準備等工作。它的名字來源是由“ Panel data”(面板數據,一個計量經濟學名詞)兩個單詞拼成的。簡單地說,你可以把 Pandas 看作是 Python 版的 Excel。

技術分享圖片

我喜歡 Pandas 的原因之一,是因為它很酷,它能很好地處理來自一大堆各種不同來源的數據,比如 Excel 表格、CSV 文件、SQL 數據庫,甚至還能處理存儲在網頁上的數據。

話不多說,讓我們開始吧!

安裝 Pandas

如果大家想找一個Python學習環境,可以加入我們的Python學習圈:784758214 ,自己是一名高級python開發工程師,這裏有我自己整理了一套最新的python系統學習教程,包括從基礎的python腳本到web開發、爬蟲、django、人工智能、機器學習等。送給正在學習python的小夥伴!每天會準時的講一些項目實戰案例,分享一些學習的方法和需要註意的小細節,,這裏是python學習者聚集地

如果你已經安裝了 Anaconda,你可以很方便地在終端或者命令提示符裏輸入命令安裝 Pandas:

技術分享圖片

如果你還沒安裝 Anaconda,你也可以用 Python 自帶的包管理工具 pip 來安裝:

技術分享圖片

Pandas 數據結構

Series 是一種一維數組,和 NumPy 裏的數組很相似。事實上,Series 基本上就是基於 NumPy 的數組對象來的。和 NumPy 的數組不同,Series 能為數據自定義標簽,也就是索引(index),然後通過索引來訪問數組中的數據。

技術分享圖片

創建一個 Series 的基本語法如下:

技術分享圖片

上面的 data 參數可以是任意數據對象,比如字典、列表甚至是 NumPy 數組,而index 參數則是對 data 的索引值,類似字典的 key。

下面這個例子裏,將創建一個 Series 對象,並用字符串對數字列表進行索引:

技術分享圖片

註意:請記住, index 參數是可省略的,你可以選擇不輸入這個參數。如果不帶 index 參數,Pandas 會自動用默認 index 進行索引,類似數組,索引值是 [0, ..., len(data) - 1] ,如下所示:

從 NumPy 數組對象創建 Series:

技術分享圖片

從 Python 字典對象創建 Series:

技術分享圖片

如上圖的 out[24] 中所示,如果你從一個 Python 字典對象創建 Series,Pandas 會自動把字典的鍵值設置成 Series 的 index,並將對應的 values 放在和索引對應的 data 裏。

和 NumPy 數組不同,Pandas 的 Series 能存放各種不同類型的對象。

從 Series 裏獲取數據

訪問 Series 裏的數據的方式,和 Python 字典基本一樣:

技術分享圖片

對 Series 進行算術運算操作

對 Series 的算術運算都是基於 index 進行的。我們可以用加減乘除(+ - * /)這樣的運算符對兩個 Series 進行運算,Pandas 將會根據索引 index,對響應的數據進行計算,結果將會以浮點數的形式存儲,以避免丟失精度。

技術分享圖片

如上,如果 Pandas 在兩個 Series 裏找不到相同的 index,對應的位置就返回一個空值 NaN。

DataFrames

Pandas 的 DataFrame(數據表)是一種 2 維數據結構,數據以表格的形式存儲,分成若幹行和列。通過 DataFrame,你能很方便地處理數據。常見的操作比如選取、替換行或列的數據,還能重組數據表、修改索引、多重篩選等。

構建一個 DataFrame 對象的基本語法如下:

舉個例子,我們可以創建一個 5 行 4 列的 DataFrame,並填上隨機數據:

看,上面表中的每一列基本上就是一個 Series ,它們都用了同一個 index。因此,我們基本上可以把 DataFrame 理解成一組采用同樣索引的 Series 的集合。

下面這個例子裏,我們將用許多 Series 來構建一個DataFrame:

技術分享圖片

以及用一個字典來創建 DataFrame:

技術分享圖片

獲取 DataFrame 中的列

要獲取一列的數據,還是用中括號 [] 的方式,跟 Series 類似。比如嘗試獲取上面這個表中的 name 列數據:

技術分享圖片

因為我們只獲取一列,所以返回的就是一個 Series。可以用 type() 函數確認返回值的類型:

技術分享圖片

如果獲取多個列,那返回的就是一個 DataFrame 類型:

技術分享圖片

向 DataFrame 裏增加數據列

創建一個列的時候,你需要先定義這個列的數據和索引。舉個栗子,比如這個 DataFrame:

技術分享圖片

增加數據列有兩種辦法:可以從頭開始定義一個 pd.Series,再把它放到表中,也可以利用現有的列來產生需要的新列。比如下面兩種操作:

定義一個 Series ,並放入 ‘Year‘ 列中:

技術分享圖片

從現有的列創建新列:

技術分享圖片

從 DataFrame 裏刪除行/列

想要刪除某一行或一列,可以用 .drop() 函數。在使用這個函數的時候,你需要先指定具體的刪除方向,axis=0 對應的是行 row,而 axis=1 對應的是列 column 。

刪除 ‘Birth_year‘ 列:

技術分享圖片

刪除 ‘d‘ 行:

技術分享圖片

請務必記住,除非用戶明確指定,否則在調用 .drop() 的時候,Pandas 並不會真的永久性地刪除這行/列。這主要是為了防止用戶誤操作丟失數據。

你可以通過調用 df 來確認數據的完整性。如果你確定要永久性刪除某一行/列,你需要加上 inplace=True 參數,比如:

技術分享圖片

獲取 DataFrame 中的一行或多行數據

要獲取某一行,你需要用 .loc[] 來按索引(標簽名)引用這一行,或者用 .iloc[],按這行在表中的位置(行數)來引用。

技術分享圖片

同時你可以用 .loc[] 來指定具體的行列範圍,並生成一個子數據表,就像在?NumPy裏做的一樣。比如,提取 ‘c‘ 行中 ‘Name’ 列的內容,可以如下操作:

技術分享圖片

此外,你還可以制定多行和/或多列,如上所示。

條件篩選

用中括號 [] 的方式,除了直接指定選中某些列外,還能接收一個條件語句,然後篩選出符合條件的行/列。比如,我們希望在下面這個表格中篩選出 ‘W‘>0 的行:

技術分享圖片

如果要進一步篩選,只看 ‘X‘ 列中 ‘W‘>0 的數據:

技術分享圖片

類似的,你還可以試試這樣的語句 df[df[‘W‘]>0][[‘X‘,‘Y‘]] ,結果將會是這樣:

上面那行相當於下面這樣的幾個操作連在一起:

技術分享圖片

你可以用邏輯運算符 &(與)和 |(或)來鏈接多個條件語句,以便一次應用多個篩選條件到當前的 DataFrame 上。舉個栗子,你可以用下面的方法篩選出同時滿足 ‘W‘>0 和‘X‘>1 的行:

技術分享圖片

重置 DataFrame 的索引

如果你覺得當前 DataFrame 的索引有問題,你可以用 .reset_index() 簡單地把整個表的索引都重置掉。這個方法將把目標 DataFrame 的索引保存在一個叫 index 的列中,而把表格的索引變成默認的從零開始的數字,也就是 [0, ..., len(data) - 1] 。比如下面這樣:

技術分享圖片

和刪除操作差不多,.reset_index() 並不會永久改變你表格的索引,除非你調用的時候明確傳入了 inplace 參數,比如:.reset_index(inplace=True)

設置 DataFrame 的索引值

類似地,我們還可以用 .set_index() 方法,將 DataFrame 裏的某一列作為索引來用。比如,我們在這個表裏新建一個名為 "ID" 的列:

技術分享圖片

然後把它設置成索引:

技術分享圖片

註意,不像 .reset_index() 會保留一個備份,然後才用默認的索引值代替原索引,.set_index() 將會完全覆蓋原來的索引值。

多級索引(MultiIndex)以及命名索引的不同等級

多級索引其實就是一個由元組(Tuple)組成的數組,每一個元組都是獨一無二的。你可以從一個包含許多數組的列表中創建多級索引(調用 MultiIndex.from_arrays ),也可以用一個包含許多元組的數組(調用 MultiIndex.from_tuples )或者是用一對可叠代對象的集合(比如兩個列表,互相兩兩配對)來構建(調用MultiIndex.from_product )。

下面這個例子,我們從元組中創建多級索引:

技術分享圖片

最後這個 list(zip()) 的嵌套函數,把上面兩個列表合並成了一個每個元素都是元組的列表。這時 my_index 的內容是這樣的:[(‘O Level‘, 21), (‘O Level‘, 22), (‘O Level‘, 23), (‘A Level‘, 21), (‘A Level‘, 22), (‘A Level‘, 23)]

接下來,我們調用 .MultiIndex.from_tuples(my_index) 生成一個多級索引對象:

技術分享圖片

最後,將這個多級索引對象轉成一個 DataFrame:

技術分享圖片

要獲取多級索引中的數據,還是用到 .loc[] 。比如,先獲取 ‘O Level‘ 下的數據:

技術分享圖片

然後再用一次 .loc[],獲取下一層 21 裏的數據:

技術分享圖片

如上所示,df 這個 DataFrame 的頭兩個索引列沒有名字,看起來不太易懂。我們可以用 .index.names 給它們加上名字:

技術分享圖片

交叉選擇行和列中的數據

我們可以用 .xs() 方法輕松獲取到多級索引中某些特定級別的數據。比如,我們需要找到所有 Levels 中,Num = 22 的行:

技術分享圖片

清洗數據

刪除或填充空值

在許多情況下,如果你用 Pandas 來讀取大量數據,往往會發現原始數據中會存在不完整的地方。在 DataFrame 中缺少數據的位置, Pandas 會自動填入一個空值,比如 NaN或 Null 。因此,我們可以選擇用 .dropna() 來丟棄這些自動填充的值,或是用.fillna() 來自動給這些空值填充數據。

比如這個例子:

技術分享圖片

當你使用 .dropna() 方法時,就是告訴 Pandas 刪除掉存在一個或多個空值的行(或者列)。刪除列用的是 .dropna(axis=0) ,刪除行用的是 .dropna(axis=1) 。

請註意,如果你沒有指定 axis 參數,默認是刪除行。

刪除列:

技術分享圖片

類似的,如果你使用 .fillna() 方法,Pandas 將對這個 DataFrame 裏所有的空值位置填上你指定的默認值。比如,將表中所有 NaN 替換成 20 :

技術分享圖片

當然,這有的時候打擊範圍太大了。於是我們可以選擇只對某些特定的行或者列進行填充。比如只對 ‘A‘ 列進行操作,在空值處填入該列的平均值:

技術分享圖片

如上所示,‘A‘ 列的平均值是 2.0,所以第二行的空值被填上了 2.0。

同理,.dropna() 和 .fillna() 並不會永久性改變你的數據,除非你傳入了inplace=True 參數。

Pandas?是基於?NumPy?的一個開源 Python 庫,它被廣泛用於快速分析數據,以及數據清洗和準備等工作。它的名字來源是由“ Panel data”(面板數據,一個計量經濟學名詞)兩個單詞拼成的。簡單地說,你可以把 Pandas 看作是 Python 版的 Excel。

我喜歡 Pandas 的原因之一,是因為它很酷,它能很好地處理來自一大堆各種不同來源的數據,比如 Excel 表格、CSV 文件、SQL 數據庫,甚至還能處理存儲在網頁上的數據。

分組統計

Pandas 的分組統計功能可以按某一列的內容對數據行進行分組,並對其應用統計函數,比如求和,平均數,中位數,標準差等等…

舉例來說,用 .groupby() 方法,我們可以對下面這數據表按 ‘Company‘ 列進行分組,並用 .mean() 求每組的平均值:

首先,初始化一個DataFrame:

技術分享圖片

然後,調用 .groupby() 方法,並繼續用 .mean() 求平均值:

技術分享圖片

上面的結果中,Sales 列就變成每個公司的分組平均數了。

計數

用 .count() 方法,能對 DataFrame 中的某個元素出現的次數進行計數。

技術分享圖片

數據描述

Pandas 的 .describe() 方法將對 DataFrame 裏的數據進行分析,並一次性生成多個描述性的統計指標,方便用戶對數據有一個直觀上的認識。

生成的指標,從左到右分別是:計數、平均數、標準差、最小值、25% 50% 75% 位置的值、最大值。

技術分享圖片

如果你不喜歡這個排版,你可以用 .transpose() 方法獲得一個豎排的格式:

技術分享圖片

如果你只想看 Google 的數據,還能這樣:

技術分享圖片

堆疊(Concat)

堆疊基本上就是簡單地把多個 DataFrame 堆在一起,拼成一個更大的 DataFrame。當你進行堆疊的時候,請務必註意你數據表的索引和列的延伸方向,堆疊的方向要和它一致。

比如,有這樣3個 DataFrame:

技術分享圖片

我們用 pd.concat() 將它堆疊成一個大的表:

技術分享圖片

因為我們沒有指定堆疊的方向,Pandas 默認按行的方向堆疊,把每個表的索引按順序疊加。

如果你想要按列的方向堆疊,那你需要傳入 axis=1 參數:

技術分享圖片

註意,這裏出現了一大堆空值。因為我們用來堆疊的3個 DataFrame 裏,有許多索引是沒有對應數據的。因此,當你使用 pd.concat() 的時候,一定要註意堆疊方向的坐標軸(行或列)含有所需的所有數據。

歸並(Merge)

使用 pd.merge() 函數,能將多個 DataFrame 歸並在一起,它的合並方式類似合並 SQL 數據表的方式。

歸並操作的基本語法是 pd.merge(left, right, how=‘inner‘, on=‘Key‘) 。其中 left 參數代表放在左側的 DataFrame,而 right 參數代表放在右邊的 DataFrame;how=‘inner‘ 指的是當左右兩個 DataFrame 中存在不重合的 Key 時,取結果的方式:inner 代表交集;Outer 代表並集。最後,on=‘Key‘ 代表需要合並的鍵值所在的列,最後整個表格會以該列為準進行歸並。

對於兩個都含有 key 列的 DataFrame,我們可以這樣歸並:

技術分享圖片

同時,我們可以傳入多個 on 參數,這樣就能按多個鍵值進行歸並:

技術分享圖片

連接(Join)

如果你要把兩個表連在一起,然而它們之間沒有太多共同的列,那麽你可以試試 .join() 方法。和 .merge() 不同,連接采用索引作為公共的鍵,而不是某一列。

技術分享圖片

同樣,inner 代表交集,Outer 代表並集。

數值處理

查找不重復的值

不重復的值,在一個 DataFrame 裏往往是獨一無二,與眾不同的。找到不重復的值,在數據分析中有助於避免樣本偏差。在 Pandas 裏,主要用到 3 種方法:

首先是 .unique() 方法。比如在下面這個 DataFrame 裏,查找 col2 列中所有不重復的值:

技術分享圖片

除了列出所有不重復的值,我們還能用 .nunique() 方法,獲取所有不重復值的個數:

技術分享圖片

此外,還可以用 .value_counts() 同時獲得所有值和對應值的計數:

技術分享圖片

apply() 方法

用 .apply() 方法,可以對 DataFrame 中的數據應用自定義函數,進行數據處理。比如,我們先定義一個 square() 函數,然後對表中的 col1 列應用這個函數:

技術分享圖片

在上面這個例子中,這個函數被應用到這一列裏的每一個元素上。同樣,我們也可以調用任意的內置函數。比如對 col3 列取長度 len :

技術分享圖片

有的時候,你定義了一個函數,而它其實只會被用到一次。那麽,我們可以用 lambda 表達式來代替函數定義,簡化代碼。比如,我們可以用這樣的 lambda 表達式代替上面 In[47] 裏的函數定義:

技術分享圖片

獲取 DataFrame 的屬性

DataFrame 的屬性包括列和索引的名字。假如你不確定表中的某個列名是否含有空格之類的字符,你可以通過 .columns 來獲取屬性值,以查看具體的列名。

技術分享圖片

排序

如果想要將整個表按某一列的值進行排序,可以用 .sort_values() :

技術分享圖片

如上所示,表格變成按 col2 列的值從小到大排序。要註意的是,表格的索引 index 還是對應著排序前的行,並沒有因為排序而丟失原來的索引數據。

查找空值

假如你有一個很大的數據集,你可以用 Pandas 的 .isnull() 方法,方便快捷地發現表中的空值:

技術分享圖片

這返回的是一個新的 DataFrame,裏面用布爾值(True/False)表示原 DataFrame 中對應位置的數據是否是空值。

數據透視表

在使用 Excel 的時候,你或許已經試過數據透視表的功能了。數據透視表是一種匯總統計表,它展現了原表格中數據的匯總統計結果。Pandas 的數據透視表能自動幫你對數據進行分組、切片、篩選、排序、計數、求和或取平均值,並將結果直觀地顯示出來。比如,這裏有個關於動物的統計表:

技術分享圖片

Pandas 數據透視表的語法是 .pivot_table(data, values=‘‘, index=[‘‘], columns=[‘‘]) ,其中 values 代表我們需要匯總統計的數據點所在的列,index 表示按該列進行分組索引,而 columns 則表示最後結果將按該列的數據進行分列。你可以在 Pandas 的官方文檔 中找到更多數據透視表的詳細用法和例子。

於是,我們按上面的語法,給這個動物統計表創建一個數據透視表:

技術分享圖片

或者也可以直接調用 df 對象的方法:

技術分享圖片

在上面的例子中,數據透視表的某些位置是 NaN 空值,因為在原數據裏沒有對應的條件下的數據。

導入導出數據

采用類似 pd.read_ 這樣的方法,你可以用 Pandas 讀取各種不同格式的數據文件,包括 Excel 表格、CSV 文件、SQL 數據庫,甚至 HTML 文件等。

讀取 CSV 文件

簡單地說,只要用 pd.read_csv() 就能將 CSV 文件裏的數據轉換成 DataFrame 對象:

技術分享圖片

寫入 CSV 文件

將 DataFrame 對象存入 .csv 文件的方法是 .to_csv(),例如,我們先創建一個 DataFrame 對象:

技術分享圖片

然後我們將這個 DataFrame 對象存成 ‘New_dataframe‘ 文件,Pandas 會自動在磁盤上創建這個文件。

技術分享圖片

這裏傳入 index=False 參數是因為不希望 Pandas 把索引列的 0~5 也存到文件中。

為了確保數據已經保存好了,你可以試試用 pd.read_csv(‘New_dataframe‘) ,把這個文件的內容讀取出來看看。

讀取 Excel 表格文件

Excel 文件是一個不錯的數據來源。使用 pd.read_excel() 方法,我們能將 Excel 表格中的數據導入 Pandas 中。請註意,Pandas 只能導入表格文件中的數據,其他對象,例如宏、圖形和公式等都不會被導入。如果文件中存在有此類對象,可能會導致 pd.read_excel() 方法執行失敗。

舉個例子,假設我們有一個 Excel 表格 ‘excel_output.xlsx‘,然後讀取它的數據:

技術分享圖片

請註意,每個 Excel 表格文件都含有一個或多個工作表,傳入 sheet_name=‘Sheet1‘ 這樣的參數,就表示只讀取 ‘excel_output.xlsx‘ 中的 Sheet1 工作表中的內容。

寫入 Excel 表格文件

跟寫入 CSV 文件類似,我們可以將一個 DataFrame 對象存成 .xlsx 文件,語法是 .to_excel() :

技術分享圖片

和前面類似,把數據存到 ‘excel_output.xlsx‘ 文件中:

技術分享圖片

讀取 HTML 文件中的數據

為了讀取 HTML 文件,你需要安裝 htmllib5,lxml 以及 BeautifulSoup4 庫,在終端或者命令提示符運行以下命令來安裝:

技術分享圖片

舉個例子,我們用讓 Pandas 讀取這個頁面的數據: https://en.wikipedia.org/wiki/Udacity 。由於一個頁面上含有多個不同的表格,我們需要通過下標 [0, ..., len(tables) - 1] 訪問數組中的不同元素。

下面的這個例子,我們顯示的是頁面中的第 2 個表格:

技術分享圖片

結語

恭喜!讀到這裏,說明你已經看完了這個教程!

如果你已經學完了本文,我想你應該已經擁有足夠的知識,可以好好調教 Pandas,做好分析之前的數據準備工作啦。接下來,你需要的是練習,練習,再練習!

最全面的Pandas的教程!沒有之一!