pandas使用教程
1、pandas簡介:
pandas是python+data+analysis的組合縮寫,是python中基於numpy和matplotlib的第三方數據分析庫,與後兩者共同構成了python數據分析的基礎工具包,享有數分三劍客之名。
2、pandas數據結構:
pandas核心數據結構有兩種,即一維的series和二維的dataframe,二者可以分別看做是在numpy一維數組和二維數組的基礎上增加了相應的標籤信息。正因如此,可以從兩個角度理解series和dataframe:
series和dataframe分別是一維和二維數組,因爲是數組,所以numpy中關於數組的用法基本可以直接應用到這兩個數據結構,包括數據創建、切片訪問、通函數、廣播機制等
series是帶標籤的一維數組,所以還可以看做是類字典結構:標籤是key,取值是value;而dataframe則可以看做是嵌套字典結構,其中列名是key,每一列的series是value。所以從這個角度講,pandas數據創建的一種靈活方式就是通過字典或者嵌套字典,同時也自然衍生出了適用於series和dataframe的類似字典訪問的接口,即通過loc索引訪問。
3、 數據讀寫:
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等文件格式的讀寫操作。
4、數據訪問:
series和dataframe兼具numpy數組和字典的結構特性,所以數據訪問都是從這兩方面入手。同時,也支持bool索引進行數據訪問和篩選。
[ ],這是一個非常便捷的訪問方式,不過需區分series和dataframe兩種數據結構理解:
series:既可以用標籤也可以用數字索引訪問單個元素,還可以用相應的切片訪問多個值,因爲只有一維信息,自然毫無懸念
dataframe:無法訪問單個元素,只能返回一列、多列或多行:單值或多值(多個列名組成的列表)訪問時按列進行查詢,單值訪問不存在列名歧義時還可直接用屬性符號" . "訪問。切片形式訪問時按行進行查詢,又區分數字切片和標籤切片兩種情況:當輸入數字索引切片時,類似於普通列表切片;當輸入標籤切片時,執行範圍查詢(即無需切片首末值存在於標籤列中),包含兩端標籤結果,無匹配行時返回爲空,但要求標籤切片類型與索引類型一致。例如,當標籤列類型(可通過df.index.dtype查看)爲時間類型時,若使用無法隱式轉換爲時間的字符串作爲索引切片,則引發報錯。
5、數據處理:
pandas最爲強大的功能當然是數據處理和分析,可獨立完成數據分析前的絕大部分數據預處理需求。簡單歸納來看,主要可分爲以下幾個方面:
數據清洗
數據處理中的清洗工作主要包括對空值、重複值和異常值的處理:
空值
判斷空值,isna或isnull,二者等價,用於判斷一個series或dataframe各元素值是否爲空的bool結果。需注意對空值的界定:即None或numpy.nan纔算空值,而空字符串、空列表等則不屬於空值;類似地,notna和notnull則用於判斷是否非空
填充空值,fillna,按一定策略對空值進行填充,如常數填充、向前/向後填充等,也可通過inplace參數確定是否本地更改
刪除空值,dropna,刪除存在空值的整行或整列,可通過axis設置,也包括inplace參數
重複值
檢測重複值,duplicated,檢測各行是否重複,返回一個行索引的bool結果,可通過keep參數設置保留第一行/最後一行/無保留,例如keep=first意味着在存在重複的多行時,首行被認爲是合法的而可以保留
刪除重複值,drop_duplicates,按行檢測並刪除重複的記錄,也可通過keep參數設置保留項。由於該方法默認是按行進行檢測,如果存在某個需要需要按列刪除,則可以先轉置再執行該方法
異常值,判斷異常值的標準依賴具體分析數據,所以這裏僅給出兩種處理異常值的可選方法
刪除,drop,接受參數在特定軸線執行刪除一條或多條記錄,可通過axis參數設置是按行刪除還是按列刪除
替換,replace,非常強大的功能,對series或dataframe中每個元素執行按條件替換操作,還可開啓正則表達式功能
數值計算
由於pandas是在numpy的基礎上實現的,所以numpy的常用數值計算操作在pandas中也適用:
通函數ufunc,即可以像操作標量一樣對series或dataframe中的所有元素執行同一操作,這與numpy的特性是一致的,例如前文提到的replace函數,本質上可算作是通函數。如下實現對數據表中逐元素求平方
廣播機制,即當維度或形狀不匹配時,會按一定條件廣播後計算。由於pandas是帶標籤的數組,所以在廣播過程中會自動按標籤匹配進行廣播,而非類似numpy那種純粹按順序進行廣播。例如,如下示例中執行一個dataframe和series相乘,雖然二者維度不等、大小不等、標籤順序也不一致,但仍能按標籤匹配得到預期結果
字符串向量化,即對於數據類型爲字符串格式的一列執行向量化的字符串操作,本質上是調用series.str屬性的系列接口,完成相應的字符串操作。尤爲強大的是,除了常用的字符串操作方法,str屬性接口中還集成了正則表達式的大部分功能,這使得pandas在處理字符串列時,兼具高效和強力。例如如下代碼可用於統計每個句子中單詞的個數
時間類型向量化操作,如字符串一樣,在pandas中另一個得到"優待"的數據類型是時間類型,正如字符串列可用str屬性調用字符串接口一樣,時間類型列可用dt屬性調用相應接口,這在處理時間類型時會十分有效。
數據轉換
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則不允許重複,僅能一對一拼接。
-
手機呼叫失敗是怎麼了
手機網絡衝突、處於飛行模式、手機信號不好、網絡設置不對或者是電話卡出現問題以及手機硬件有故障都會導致手機呼叫失敗,我們需要找出手機呼叫失敗的原因,然後再有針對性的去解決問題。如果我們不小心點開了手機的【飛行模式】,那麼就無法撥打電話了,要馬上把手機...
-
微信怎麼建
1、微信的創建方法:打開微信。點擊更多。選擇註冊。輸入暱稱,手機號和密碼。勾選同意協議。點擊註冊即可。2、微信推薦使用手機號註冊,並支持100餘個國家的手機號。微信不可以通過QQ號直接登錄註冊或者通過郵箱帳號註冊。第一次使用QQ號登陸時,是登陸不了的,只能用...
-
螞蟻森林如何不讓別人收取能量,積分兌換
1、首先打開支付寶APP,點擊:我的,在我的頁面找到:螞蟻會員,點進去。2、進來之後,我們在螞蟻會員頁面找到:領積分,點擊進去。3、進來之後我們可以看到自己的積分,以及:螞蟻森林能量保護罩的圖標,我們會看到兌換需要200積分,積分足夠可以點擊,馬上兌。4、之後進入螞蟻森林頁面...
-
excel表格設打開密碼忘記了怎麼辦
我們在工作中經常會使用到Excel表格,如果這個表格的內容非常重要,並且不能夠輕易外露的話,可以設置一個保護密碼,但是如果表格的密碼忘記了,應該怎麼打開呢?受保護的Excel文檔是無法修改的,輸入內容就會出現要求輸入密碼的提示框,我們修改文件的後綴名爲rar,再回車確定...