Pandas入門詳細教程

2021-02-20 Python數據之道

作者:luanhz

來源:小數志

本文主要是對pandas進行入門詳細介紹,通過本文你將系統性了解pandas為何會有數據分析界"瑞士軍刀"的盛譽。

行文二級目錄

pandas,python+data+analysis的組合縮寫,是python中基於numpy和matplotlib的第三方數據分析庫,與後兩者共同構成了python數據分析的基礎工具包,享有數分三劍客之名。

正因為pandas是在numpy基礎上實現,其核心數據結構與numpy的ndarray十分相似,但pandas與numpy的關係不是替代,而是互為補充。二者之間主要區別是:
pandas主要面向數據處理與分析,主要具有以下功能特色:按索引匹配的廣播機制,這裡的廣播機制與numpy廣播機制還有很大不同便捷的數據讀寫操作,相比於numpy僅支持數字索引,pandas的兩種數據結構均支持標籤索引,包括bool索引也是支持的類比SQL的join和groupby功能,pandas可以很容易實現SQL這兩個核心功能,實際上,SQL的絕大部分DQL和DML操作在pandas中都可以實現類比Excel的數據透視表功能,Excel中最為強大的數據分析工具之一是數據透視表,這在pandas中也可輕鬆實現自帶正則表達式的字符串向量化操作,對pandas中的一列字符串進行通函數操作,而且自帶正則表達式的大部分接口常用的數據分析與統計功能,包括基本統計量、分組統計分析等集成matplotlib的常用可視化接口,無論是series還是dataframe,均支持面向對象的繪圖接口
正是由於具有這些強大的數據分析與處理能力,pandas還有數據處理中"瑞士軍刀"的美名。

pandas核心數據結構有兩種,即一維的series和二維的dataframe,二者可以分別看做是在numpy一維數組和二維數組的基礎上增加了相應的標籤信息。正因如此,可以從兩個角度理解series和dataframe:

series和dataframe分別是一維和二維數組,因為是數組,所以numpy中關於數組的用法基本可以直接應用到這兩個數據結構,包括數據創建、切片訪問、通函數、廣播機制等

series是帶標籤的一維數組,所以還可以看做是類字典結構:標籤是key,取值是value;而dataframe則可以看做是嵌套字典結構,其中列名是key,每一列的series是value。所以從這個角度講,pandas數據創建的一種靈活方式就是通過字典或者嵌套字典,同時也自然衍生出了適用於series和dataframe的類似字典訪問的接口,即通過loc索引訪問。

注意,這裡強調series和dataframe是一個類字典結構而非真正意義上的字典,原因在於series中允許標籤名重複、dataframe中則允許列名和標籤名均有重複,而這是一個真正字典所不允許的。

考慮series和dataframe兼具numpy數組和字典的特性,那麼就不難理解二者的以下屬性:

ndim/shape/dtypes/size/T,分別表示了數據的維數、形狀、數據類型和元素個數以及轉置結果。其中,由於pandas允許數據類型是異構的,各列之間可能含有多種不同的數據類型,所以dtype取其複數形式dtypes。與此同時,series因為只有一列,所以數據類型自然也就只有一種,pandas為了兼容二者,series的數據類型屬性既可以用dtype也可以用dtypes獲取;而dataframe則只能用dtypes。

index/columns/values,分別對應了行標籤、列標籤和數據,其中數據就是一個格式向上兼容所有列數據類型的array。為了沿襲字典中的訪問習慣,還可以用keys()訪問標籤信息,在series返回index標籤,在dataframe中則返回columns列名;可以用items()訪問鍵值對,但一般用處不大。

這裡提到了index和columns分別代表行標籤和列標籤,就不得不提到pandas中的另一個數據結構:Index,例如series中標籤列、dataframe中行標籤和列標籤均屬於這種數據結構。既然是數據結構,就必然有數據類型dtype屬性,例如數值型、字符串型或時間類型等,其類型絕大多數場合併不是我們關注的主體,但有些時候值得注意,如後文中提到的通過[ ]執行標籤切片訪問行的過程。此外,index數據結構還有名字屬性name(默認為None)、形狀屬性shape等。

關於series和dataframe數據結構本身,有大量的方法可用於重構結構信息:

rename,可以對標籤名重命名,也可以重置index和columns的部分標籤列信息,接收標量(用於對標籤名重命名)或字典(用於重命名行標籤和列標籤)

reindex,接收一個新的序列與已有標籤列匹配,當原標籤列中不存在相應信息時,填充NAN或者可選的填充值

set_index/reset_index,互為逆操作,前者是將已有的一列信息設置為標籤列,而後者是將原標籤列歸為數據,並重置為默認數字標籤

set_axis,設置標籤列,一次只能設置一列信息,與rename功能相近,但接收參數為一個序列更改全部標籤列信息(rename中是接收字典,允許只更改部分信息)

rename_axis,重命名標籤名,rename中也可實現相同功能

在pandas早些版本中,除一維數據結構series和二維數據結構dataframe外,還支持三維數據結構panel。這三者是構成遞進包容關係,panel即是dataframe的容器,用於存儲多個dataframe。2019年7月,隨著pandas 0.25版本的推出,pandas團隊宣布正式棄用panel數據結構,而相應功能建議由多層索引實現。

也正因為pandas這3種獨特的數據結構,個人一度認為pandas包名解釋為:pandas = panel + dataframe + series,根據維數取相應的首字母個數,從而構成pandas,這是個人非常喜歡的一種關於pandas縮寫的解釋。

pandas支持大部分的主流文件格式進行數據讀寫,常用格式及接口為:

文本文件,主要包括csv和txt兩種等,相應接口為read_csv()和to_csv(),分別用於讀寫數據

Excel文件,包括xls和xlsx兩種格式均得到支持,底層是調用了xlwt和xlrd進行excel文件操作,相應接口為read_excel()和to_excel()

SQL文件,支持大部分主流關係型資料庫,例如MySQL,需要相應的資料庫模塊支持,相應接口為read_sql()和to_sql()

此外,pandas還支持html、json等文件格式的讀寫操作。

series和dataframe兼具numpy數組和字典的結構特性,所以數據訪問都是從這兩方面入手。同時,也支持bool索引進行數據訪問和篩選。

切片形式返回行查詢,且為範圍查詢

切片類型與索引列類型不一致時,引發報錯

query,按列對dataframe執行條件查詢,一般可用常規的條件查詢替代

get,由於series和dataframe均可以看做是類字典結構,所以也可使用字典中的get()方法,主要適用於不確定數據結構中是否包含該標籤時,與字典的get方法完全一致

lookup,loc的一種特殊形式,分別傳入一組行標籤和列標籤,lookup解析成一組行列坐標,返回相應結果:

pandas中支持大量的數據訪問接口,但萬變不離其宗:只要聯想兩種數據結構兼具numpy數組和字典的雙重特性,就不難理解這些數據訪問的邏輯原理。當然,重點還是掌握[]、loc和iloc三種方法。

loc和iloc應該理解為是series和dataframe的屬性而非函數,應用loc和iloc進行數據訪問就是根據屬性值訪問的過程

另外,在pandas早些版本中,還存在loc和iloc的兼容結構,即ix,可混合使用標籤和數字索引,但往往容易混亂,所以現已棄用

pandas最為強大的功能當然是數據處理和分析,可獨立完成數據分析前的絕大部分數據預處理需求。簡單歸納來看,主要可分為以下幾個方面:

數據處理中的清洗工作主要包括對空值、重複值和異常值的處理:異常值,判斷異常值的標準依賴具體分析數據,所以這裡僅給出兩種處理異常值的可選方法刪除,drop,接受參數在特定軸線執行刪除一條或多條記錄,可通過axis參數設置是按行刪除還是按列刪除替換,replace,非常強大的功能,對series或dataframe中每個元素執行按條件替換操作,還可開啟正則表達式功能

由於pandas是在numpy的基礎上實現的,所以numpy的常用數值計算操作在pandas中也適用:

通函數ufunc,即可以像操作標量一樣對series或dataframe中的所有元素執行同一操作,這與numpy的特性是一致的,例如前文提到的replace函數,本質上可算作是通函數。如下實現對數據表中逐元素求平方

廣播機制,即當維度或形狀不匹配時,會按一定條件廣播後計算。由於pandas是帶標籤的數組,所以在廣播過程中會自動按標籤匹配進行廣播,而非類似numpy那種純粹按順序進行廣播。例如,如下示例中執行一個dataframe和series相乘,雖然二者維度不等、大小不等、標籤順序也不一致,但仍能按標籤匹配得到預期結果

字符串向量化,即對於數據類型為字符串格式的一列執行向量化的字符串操作,本質上是調用series.str屬性的系列接口,完成相應的字符串操作。尤為強大的是,除了常用的字符串操作方法,str屬性接口中還集成了正則表達式的大部分功能,這使得pandas在處理字符串列時,兼具高效和強力。例如如下代碼可用於統計每個句子中單詞的個數

需注意的是,這裡的字符串接口與python中普通字符串的接口形式上很是相近,但二者是不一樣的。時間類型向量化操作,如字符串一樣,在pandas中另一個得到"優待"的數據類型是時間類型,正如字符串列可用str屬性調用字符串接口一樣,時間類型列可用dt屬性調用相應接口,這在處理時間類型時會十分有效。


前文提到,在處理特定值時可用replace對每個元素執行相同的操作,然而replace一般僅能用於簡單的替換操作,所以pandas還提供了更為強大的數據轉換方法

map,適用於series對象,功能與python中的普通map函數類似,即對給定序列中的每個值執行相同的映射操作,不同的是series中的map接口的映射方式既可以是一個函數,也可以是一個字典apply,既適用於series對象也適用於dataframe對象,但對二者處理的粒度是不一樣的:apply應用於series時是逐元素執行函數操作;apply應用於dataframe時是逐行或者逐列執行函數操作(通過axis參數設置對行還是對列,默認是行),僅接收函數作為參數applymap,僅適用於dataframe對象,且是對dataframe中的每個元素執行函數操作,從這個角度講,與replace類似,applymap可看作是dataframe對象的通函數。

pandas中又一個重量級數據處理功能是對多個dataframe進行合併與拼接,對應SQL中兩個非常重要的操作:union和join。pandas完成這兩個功能主要依賴以下函數:

concat,與numpy中的concatenate類似,但功能更為強大,可通過一個axis參數設置是橫向或者拼接,要求非拼接軸向標籤唯一(例如沿著行進行拼接時,要求每個df內部列名是唯一的,但兩個df間可以重複,畢竟有相同列才有拼接的實際意義)

merge,完全類似於SQL中的join語法,僅支持橫向拼接,通過設置連接欄位,實現對同一記錄的不同列信息連接,支持inner、left、right和outer4種連接方式,但只能實現SQL中的等值連接

join,語法和功能與merge一致,不同的是merge既可以用pandas接口調用,也可以用dataframe對象接口調用,而join則只適用於dataframe對象接口

append,concat執行axis=0時的一個簡化接口,類似列表的append函數一樣

實際上,concat通過設置axis=1也可實現與merge類似的效果,二者的區別在於:merge允許連接欄位重複,類似一對多或者多對一連接,此時將產生笛卡爾積結果;而concat則不允許重複,僅能一對一拼接。

建表語句

通過設置參數,concat和merge實現相同效果

pandas中的另一大類功能是數據分析,通過豐富的接口,可實現大量的統計需求,包括Excel和SQL中的大部分分析過程,在pandas中均可以實現。

pandas內置了豐富的統計接口,這是與numpy是一致的,同時又包括一些常用統計信息的集成接口。

count、value_counts,前者既適用於series也適用於dataframe,用於按列統計個數,實現忽略空值後的計數;而value_counts則僅適用於series,執行分組統計,並默認按頻數高低執行降序排列,在統計分析中很有用

unique、nunique,也是僅適用於series對象,統計唯一值信息,前者返回唯一值結果列表,後者返回唯一值個數(number of unique)

sort_index、sort_values,既適用於series也適用於dataframe,sort_index是對標籤列執行排序,如果是dataframe可通過axis參數設置是對行標籤還是列標籤執行排序;sort_values是按值排序,如果是dataframe對象,也可通過axis參數設置排序方向是行還是列,同時根據by參數傳入指定的行或者列,可傳入多行或多列並分別設置升序降序參數,非常靈活。另外,在標籤列已經命名的情況下,sort_values可通過by標籤名實現與sort_index相同的效果。

pandas的另一個強大的數據分析功能是分組聚合以及數據透視表,前者堪比SQL中的groupby,後者媲美Excel中的數據透視表。groupby,類比SQL中的group by功能,即按某一列或多列執行分組。一般而言,分組的目的是為了後續的聚合統計,所有groupby函數一般不單獨使用,而需要級聯其他聚合函數共同完成特定需求,例如分組求和、分組求均值等。

pandas官網關於groupby過程的解釋

級聯其他聚合函數的方式一般有兩種:單一的聚合需求用groupby+聚合函數即可,複雜的大量聚合則可借用agg函數,agg函數接受多種參數形式作為聚合函數,功能更為強大。

兩種分組聚合形式

pivot,pivot英文有"支點"或者"旋轉"的意思,排序算法中經典的快速排序就是不斷根據pivot不斷將數據二分,從而加速排序過程。用在這裡,實際上就是執行行列重整。例如,以某列取值為重整後行標籤,以另一列取值作為重整後的列標籤,以其他列取值作為填充value,即實現了數據表的行列重整。以SQL中經典的學生成績表為例,給定原始學生—課程—成績表,需重整為學生vs課程的成績表,則可應用pivot實現:另外,還有一對函數也常用於數據重整,即stack和unstack,其中unstack執行效果與pivot非常類似,而stack則是unstack的逆過程。pivot_table,有了pivot就不難理解pivot_table,實際上它是在前者的基礎上增加了聚合的過程,類似於Excel中的數據透視表功能。仍然考慮前述學生成績表的例子,但是再增加一列班級信息,需求是統計各班級每門課程的平均分。由於此時各班的每門課成績信息不唯一,所以直接用pivot進行重整會報錯,此時即需要對各班各門課程成績進行聚合後重整,比如取平均分。


pandas集成了matplotlib中的常用可視化圖形接口,可通過series和dataframe兩種數據結構面向對象的接口方式簡單調用。關於面向對象接口和plt接口繪圖方式的區別,可參考python數據科學系列:matplotlib入門詳細教程。

兩種數據結構作圖,區別僅在於series是繪製單個圖形,而dataframe則是繪製一組圖形,且在dataframe繪圖結果中以列名為標籤自動添加legend。另外,均支持兩種形式的繪圖接口:

不過,pandas繪圖中僅集成了常用的圖表接口,更多複雜的繪圖需求往往還需依賴matplotlib或者其他可視化庫。


相關焦點

  • python:pandas入門詳細教程
    前面介紹了numpy的入門基本知識
  • python數據科學系列:pandas入門詳細教程
    前2篇分別系統性介紹了numpy和matplotlib的入門基本知識
  • Python pandas模塊21個常用操作可視化
    下面對pandas常用的功能進行一個可視化的介紹,希望能讓大家更容易理解和學習pandas。1、Series序列系列(Series)是能夠保存任何類型的數據(整數,字符串,浮點數,Python對象等)的一維標記數組。軸標籤統稱為索引。
  • 【教程】MSP430單片機輕鬆入門與實踐教程
    本套課程基於暢學MSP430開發板講解,從理論到實踐入門教程。包含:MSP430單片機簡介、寄存器設置及使用、硬體測試、MSP430單片機C語言編程。      本課程面向各領域的單片機設計用戶,尤其是對已掌握單片機開發理論但缺少實際開發經驗的讀者更具指導意義,同時也可作為各類高校相關專業和社會培訓班的課程教材使用。
  • CodeBlocks的入門使用教程
    以上就是CodeBlocks編譯器的入門教程,希望對大家有用!
  • ActiveMQ詳細入門教程系列(一)
    Kafka)比較特性MQActiveMQRabbitMQRocketMQKafka生產者消費者模式支持支持支持支持發布訂閱模式支持支持支持支持請求回應模式支持支持不支持不支持Api完備性高高高高多語言支持支持支持java支持單機吞吐量萬級萬級萬級十萬級消息延遲無微秒級毫秒級毫秒級可用性高(主從)高(主從)非常高(分布式)非常高(分布式)消息丟失低低理論上不會丟失理論上不會丟失文檔的完備性高高高高提供快速入門有有有有社區活躍度高高有高商業支持無無商業雲商業雲四
  • 圖解-Python表格操作包Pandas
    下面對pandas常用的功能進行一個可視化的介紹,希望能讓大家更容易理解和學習pandas。1、Series序列系列(Series)是能夠保存任何類型的數據(整數,字符串,浮點數,Python對象等)的一維標記數組。軸標籤統稱為索引。
  • data.table 與 pandas
    為了方便查閱和對比,本文分別用 data.table[3] 與 pandas[4] 實現了常見的數據處理任務。數據框(data frame)是大家接觸最多的數據格式,它的每一列都是長度相等、類型一致的向量。對數據框的操作可以從行與列兩個維度,拆解為以下五類基本操作。這一思路來自 dplyr[5] 包的幫助文檔,因此下面五類基本操作的英文均為該包的函數名。
  • iptables系列教程(一)| iptables入門篇
    小朋友你是否有很多問號今天只是 iptables 入門篇,下個章節再為大家詳細介紹iptables語法規則及企業實戰案例。相信看完明天教程,多加練習後您不僅能看懂上面的配置實例,還可以利用iptables打造出銅牆鐵壁級伺服器~結語如果您覺得看完本文後有所收穫, 還希望您隨手幫忙點個在看 、或者分享轉發。您的支持是我堅持分享的最大動力!
  • 【ECMAScript 6 入門教程】let 和 const 命令
    本節內容完~PS:《ECMAScript 6 入門》是一本開源的 JavaScript 語言教程,全面介紹 ECMAScript 6 新引入的語法特性。本書覆蓋 ES6 與上一個版本 ES5 的所有不同之處,對涉及的語法知識給予詳細介紹,並給出大量簡潔易懂的示例代碼。
  • 在pandas中使用數據透視表
    pandas也有透視表?pandas作為編程領域最強大的數據分析工具之一,自然也有透視表的功能。在pandas中,透視表操作由pivot_table()函數實現,不要小看只是一個函數,但卻可以玩轉數據表,解決大麻煩。pivot_table使用方法:
  • Simplis入門教程1
    ,詳細論述從原理圖到參數以及分層設計的完整過程。在本章中:1.1 SIMetrix / SIMPLIS軟體環境1.2軟體常規選項設置1.3顯示元器件選擇器1.4設置教程的用戶界面1.5創建新原理圖1.6保存原理圖1.7將工作目錄添加到文件視圖
  • Python 數據處理(三)—— pandas
    能夠熟練使用 pandas,處理數據將是事半功倍的,它的種種優點就不一一介紹了,下面開始正題吧。安裝如果你系統中安裝的是 Anaconda 環境的話,會自動安裝 pandas、numpy、matplotlib 等常用的數據科學相關的庫。
  • 【教程】暢學無線模塊實戰教程
    課程詳情:     《無線模塊實戰教程》由暢學電子專業的電子工程師團隊設計規劃,並獨家錄製
  • 【Warframe新手入門教程】初始50白金買什麼好+白金怎麼賺?
    ①4k,教程就不多說了。找一下就有。此門檻很低,對戰甲和配置基本沒有要求。刷4k卡,然後賣錢,4k中的戰甲卡一張20p左右(註:p表示白金);可靠4k賺第一桶金!②io刷t2遺物。可在氏族大佬刷的時候蹭車,或者自己做一套奶媽去刷。
  • 電腦入門教程(二)兩個常用的網絡命令詳解
    電腦入門教程(二):兩個常用的網絡命令詳解 net命令:(所有的參數在代碼寫的教程裡都有,我這裡給大家介紹幾個常用的
  • Halcon 入門教程(01)
    這篇教程很簡單,實現的功能是計算下圖中曲別針的數量和每個曲別針的朝向。
  • 【教程】人體紅外感應模塊實戰教程
    課程詳情:     《人體紅外感應模塊實戰教程》由暢學電子專業的電子工程師團隊設計規劃
  • u盤裝系統教程win7詳細步驟
    用U盤裝Win7系統已經不是什麼新鮮事,網上有一大堆U盤裝win7系統教程……對於第一次裝系統的小白,幾乎都是按照教程步驟安裝,缺失一個步驟就不放心了
  • 煙霧傳感器模塊實戰教程
    本課程是煙霧傳感器模塊設計學習者從入門到深入的一套經典視頻教程,以初學者為對象,從零開始手把手教你學習單片機模塊設計,循序漸進地基於理論講解並結合實驗項目實戰開發,並講解當前最熱門的51單片機的C程序設計!      本教程的亮點就是在分析初學者認知規律的基礎上,對51單片機模塊的應用基礎知識進行系統而翔實的介紹。