pandas | DataFrame中的排序與彙總方法

TechFlow2019發表於2020-08-19

本文始發於個人公眾號:TechFlow,原創不易,求個關注


今天是pandas資料處理專題的第六篇文章,我們來聊聊DataFrame的排序與彙總運算。

在上一篇文章當中我們主要介紹了DataFrame當中的apply方法,如何在一個DataFrame對每一行或者是每一列進行廣播運算,使得我們可以在很短的時間內處理整份資料。今天我們來聊聊如何對一個DataFrame根據我們的需要進行排序以及一些彙總運算的使用方法。

排序

排序是我們一個非常基本的需求,在pandas當中將這個需求進一步細分,細分成了根據索引排序以及根據值排序。我們先來看看Series當中的排序方法。

Series當中的排序方法有兩個,一個是sort_index,顧名思義根據Series中的索引對這些值進行排序。另一個是sort_values,根據Series中的值來排序。這兩個方法都會返回一個新的Series:

索引排序

對於DataFrame來說也是一樣,同樣有根據值排序以及根據索引排序這兩個功能。但是由於DataFrame是一個二維的資料,所以在使用上會有些不同。最簡單的差別是在於Series只有一列,我們明確的知道排序的物件,但是DataFrame不是,它當中的索引就分為兩種,分別是行索引以及列索引。所以我們在排序的時候需要指定我們想要排序的軸,也就是axis。

預設的情況我們是根據行索引進行排序,如果我們要指定根據列索引進行排序,需要傳入引數axis=1。

我們還可以傳入ascending這個引數,用來指定我們想要的排序順序是正序還是倒序

值排序

DataFrame的值排序有所不同,我們不能對行進行排序,只能針對列。我們通過by引數傳入我們希望排序參照的列,可以是一列也可以是多列。

排名

有的時候我們希望得到元素的排名,我們會希望知道當前元素在整體當中排第幾,pandas當中也提供了這個功能,它就是rank方法。

我們可以發現我們隨手輸入的一串數字當中,包含兩個7,7是Series當中最大的數字,但是它們的排名為什麼是6.5呢?

其實很簡單,因為7出現了兩次,分別是第6位和第7位,這裡對它所有出現的排名取了平均,所以是6.5。如果我們不希望它取平均,而是根據出現的先後順序給出排名的話,我們可以用method引數指定我們希望的效果。

method的合法引數並不止first這一種,還有一些其他稍微冷門一些的用法,我們一併列出。

如果是DataFrame的話,預設是以行為單位,計算每一行中元素佔整體的排名。我們也可以通過axis引數指定以列為單位計算:

彙總運算

最後我們來介紹一下DataFrame當中的彙總運算,彙總運算也就是聚合運算,比如我們最常見的sum方法,對一批資料進行聚合求和。DataFrame當中同樣有類似的方法,我們一個一個來看。

首先是sum,我們可以使用sum來對DataFrame進行求和,如果不傳任何引數,預設是對每一行進行求和。

除了sum之外,另一個常用的就是mean,可以針對一行或者是一列求平均。

由於DataFrame當中常常會有為NA的元素,所以我們可以通過skipna這個引數排除掉缺失值之後再計算平均值。

另一個我個人覺得很好用的方法是descirbe,可以返回DataFrame當中的整體資訊。比如每一列的均值、樣本數量、標準差、最小值、最大值等等。是一個常用的統計方法,可以用來了解DataFrame當中資料的分佈情況。

除了介紹的這些方法之外,DataFrame當中還有很多類似的彙總運算方法,比如idxmax,idxmin,var,std等等,大家感興趣可以去查閱相關文件,但是根據我的經驗一般用不到。

今天的文章到這裡就結束了,如果喜歡本文的話,請來一波素質三連,給我一點支援吧(關注、轉發、點贊)。

- END -

相關文章