1. 程式人生 > >使用Pandas對資料進行篩選和排序

使用Pandas對資料進行篩選和排序

篩選和排序是Excel中使用頻率最多的功能,通過這個功能可以很方便的對資料表中的資料使用指定的條件進行篩選和計算,以獲得需要的結果。在Pandas中通過.sort和.loc函式也可以實現這兩 個功能。.sort函式可以實現對資料表的排序操作,.loc函式可以實現對資料表的篩選操作。本篇文章將介紹如果通過Pandas的這兩個函式完成Excel中的篩選和排序操作。

Excel篩選和排序

首選匯入需要使用的Pandas庫和numpy庫,讀取並建立資料表,將資料表命名為lc。

import pandas as pd
import numpy as np
lc=pd.DataFrame(pd.read_csv('LoanStats3a.csv',header=1))

建立資料表後,開始使用Pandas的.sort函式對資料表進行排序操作,下面是Pandas官方對.sort函式語法和使用方法的說明。.sort函式主要包含6個引數,columns為要進行排序的列名稱, ascending為排序的方式true為升序,False為降序,預設為true。axis為排序的軸,0表示index,1表示columns,當對資料列進行排序時,axis必須設定為0。inplace預設為False,表示對資料 表進行排序,不建立新例項。Kind可選擇排序的方式,如快速排序等。na_position對NaN值的處理方式,可以選擇first和last兩種方式,預設為last,也就是將NaN值放在排序的結尾。

sort官方說明

在瞭解了.sort函式的語法和使用方法後,我們開始使用這個函式對資料進行排序操作,資料來源來自Lending Club 2017-2011年的公開資料。首先對單列資料進行排序。

對單列資料進行排序

升序
單列資料的排序的方法很簡單,按照.sort函式中的介紹,寫清楚要排序的資料表名稱,以及要進行排序的列名稱即可。具體的程式碼和排序結果如下所示,其中lc是前面我們讀取並建立的資料表名稱,loan_amnt是要進行排序的列名稱。這裡我們對lc資料表按loan_amnt列進行升序排列。這裡需要說明的是ascending引數的預設值是True,也就是升序。因此下面的兩種寫法效果是一樣的 。

lc.sort(["loan_amnt"])
lc.sort(["loan_amnt"],ascending=True)

對資料排序_升序

降序
將ascending引數的值改為False就完成對資料表的降序排列工作。與升序排列的資料表相比可以發現升序排列將loan_amnt列的最小值放在了前面,因此我們可以判斷loan_amnt的最小金額為500,與之相反,降序排列將最大值放在了前面,因此loan_amnt的最大金額應該為35000。這裡我們沒有設定na_position引數的值,因此按預設情況loan_amnt列的NaN值在排序的結尾顯示。以下顯示了降序排列的程式碼和結果。

lc.sort(["loan_amnt"],ascending=False)

對資料排序_降序

對多列資料進行排序

除了對單列資料進行排序以外,.sort函式還可以對多列資料進行排序操作。下面我們分別對loan_amnt和int_rate欄位進行降序排列,以下是具體的程式碼和排序結果,與單列資料排序的程式碼相比,這裡只增加了一個新的列名稱int_rate。

lc.sort(["loan_amnt","int_rate"],ascending=False)

對多列資料進行排序1

我們將需要排序的兩個列名稱互換位置,再次執行降序排列操作。觀察兩次的排序結果可以發現,這次的結果與之前的結果有一些差異。Loan_amnt欄位的排序結果有些混亂,有些較小的值排在了較大值的前面。這是因為第一次排序時loan_amnt是第一排序欄位,int_rate是第二排序欄位。兩個欄位交換位置第二次排序後,int_rate變成了第一排序欄位,loan_amnt變成了第二排序欄位 。

lc.sort(["int_rate","loan_amnt"],ascending=False)

對多列資料進行排序2
獲取金額最小前10項

在完成了對資料表排序的操作後,我們可以對資料表進行簡單的篩選,例如獲取loan_amnt金額最小的前10名資料。具體的方法是先對lc資料表按loan_amnt升序排列,然後取前10名的資料。NaN值預設在排序結果的結尾顯示。以下是具體程式碼和結果。與前面單列升序排列的程式碼相比只在結尾增加了.head()函式。

lc.sort(["loan_amnt"],ascending=True).head(10)

篩選最小前10項

獲取金額最大前10項

獲取金額最大前10項的程式碼與獲取金額最小前10項略有差異,本來我們只需要複製前面的程式碼,然後將.head()函式改為tail()函式即可,但由於NaN值在排序的尾部,因此,我們將lc資料表按loan_amnt按降序排列,並取排名前10的資料。當然這並不是唯一的方法,我們還可以通過放棄NaN值的排序或者將NaN值在排序前部顯示來解決這個問題。以下是具體的程式碼和執行結果。

lc.sort(["loan_amnt"],ascending=False).head(10)

篩選最大前10項
介紹完排序功能後再來看下篩選,在篩選功能上Pandas使用的是.loc函式。以下是Pandas官方對.loc函式的語法和使用方法的說明。

loc官方說明

單列資料篩選並排序

我們使用.loc對lc資料表中grade列為B值的資料條目進行了篩選操作,具體的程式碼和篩選結果如下。在程式碼中lc.loc[]是.loc函式的語法,lc[“grade”] == “B”是具體的篩選條件。由於資料表較大,因此在最後使用了head()函式只顯示前5行篩選結果。從篩選結果來看grade列的值都為B。

lc.loc[lc["grade"] == "B"].head()

單列資料篩選_包含

篩選條件除了”等於”(==)以外,還可以使用”不等於”(!=)來排除列中特定的值。我們使用”不等於”來篩選grade列中不是B值的資料條目。以下是具體的程式碼和篩選結果,可以看到篩選結果中的grade列裡已經不包含B值了。

lc.loc[lc["grade"] != "B"].head()

單列資料篩選_排除

很多時候我們只關注資料表中某幾列的資料,這時可以在前面篩選程式碼的基礎上增加要顯示的列名稱和顯示順序。下面是具體的程式碼和篩選結果。程式碼部分與之前相比增加了要顯示的列名稱 [“member_id”, “loan_amnt”, “grade”]。其餘部分均沒有改變。在篩選結果的資料表中可以看到僅顯示了我們在程式碼中列出的三列。

lc.loc[lc["grade"] == "B", ["member_id", "loan_amnt", "grade"]].head()

單列資料篩選_包含並限定列

若要對篩選結果進行排序可以聯合使用.loc函式和.sort函式。下面的程式碼中首先對資料表的grade列進行篩選,選擇所有值為B的資料,並限定了結果中要顯示的三列的名稱。最後對篩選出的結果按loan_amnt的金額進行升序排序。

lc.loc[lc["grade"] == "B", ["member_id", "loan_amnt", "grade"]].sort(["loan_amnt"])

單列資料篩選_包含並限定列升序

在程式碼後面增加ascending引數,並將值設定為False就可實現對篩選結果的降序排列。以下為具體的程式碼和篩選及排序結果。

lc.loc[lc["grade"] != "B", ["member_id", "loan_amnt", "grade"]].sort(["loan_amnt"],ascending=False)

單列資料篩選_排除並限定列降序

多列資料篩選並排序

Pandas的.loc引數還可以同時對多列資料進行篩選,並且支援不同篩選條件邏輯組合。常用的篩選條件包括”等於”(==)”,不等於”(!),”大於”(>)”,小於”(<)”,大於等於”(>=)” ,小於等於”(<=)等等。邏輯組合包括”與”()和”或”()。下面我們將通過3條多列資料篩選程式碼逐一進行介紹。

第一條程式碼使用”與”邏輯,篩選出了grade等於B,並且loan_amnt金額大於5000的資料。並限定了顯示的列名稱。從篩選結果中可以看出grade列的值都是B,loan_amnt的金額均大於5000。

lc.loc[(lc["grade"] == "B") & (lc["loan_amnt"]>5000), ["member_id", "term" , "loan_amnt", "grade","sub_grade", "int_rate"]].head()

多列資料篩選_與

第二條程式碼也使用”與”邏輯,篩選出了grade不等於B,並且loan_status不等於Charged Off的資料,同時也限定了顯示的列名稱。從篩選結果中看grade列不包含B值,並且loan_status列不包含Charged Off值。

lc.loc[(lc["grade"] != "B") & (lc["loan_status"] != "Charged Off"),["member_id", "term" , "loan_amnt", "grade", "sub_grade", "loan_status"]].head()

多列資料篩選_與1

第三條程式碼使用了”或”邏輯,篩選出了grade列值為B,或loan_amnt列金額大於5000的資料,同時也限定了顯示的列名稱。從篩選結果來看,grade列除了B值以外還保留了其他的值,而這些值在loan_amnt列的金額均大於5000。換句話說,一條資料只要grade列或loan_amnt列任意之一符合篩選條件,這條資料就會被顯示。

lc.loc[(lc["grade"] == "B") | (lc["loan_amnt"] > 5000), ["member_id", "term" , "loan_amnt", "grade","sub_grade", "int_rate"]].head()

多列資料篩選_或

多列篩選也可以進行排序,方法與單列篩選後排序基本一樣,下面的程式碼對多列篩選後的結果按loan_amnt列進行升序排序。由於篩選條件中限定了loan_amnt列的值要大於5000,因此排序的結果從5020開始。

lc.loc[(lc["grade"] == "B") & (lc["loan_amnt"] > 5000), ["member_id", "term" , "loan_amnt", "grade","sub_grade", "int_rate"]].sort(["loan_amnt"])

多列資料篩選_或

對多列篩選結果進行降序排序只需在前面升序排序程式碼的基礎上增加ascending引數,並將值設定為False即可。下面是多列篩選後降序排序的程式碼和結果。

lc.loc[(lc["grade"] == "B") & (lc["loan_amnt"] > 5000), ["member_id", "term" , "loan_amnt", "grade","sub_grade", "int_rate"]].sort(["loan_amnt"],ascending=False)

多列資料篩選_與降序

無論是”與”條件,還是”或”條件都可以在篩選後使用排序。下面程式碼是對使用了“或”邏輯條件的篩選結果進行降序排序的程式碼和結果。

lc.loc[(lc["grade"] == "B") | (lc["loan_amnt"] > 5000), ["member_id", "term" , "loan_amnt", "grade","sub_grade", "int_rate"]].sort(["loan_amnt"],ascending=False)

多列資料篩選_或降序

Pandas中的排序和篩選基本介紹完了,在實際的分析工作中,篩選只是分析過程中的一個步驟,很多時候我們還需要對篩選後的結果進行彙總,例如求和,計數,或計算均值等等。也就是Excel中常用的sumifs和countifs函式。

按篩選條件求和(sumif, sumifs)

在單列篩選的程式碼後增加求和條件就相當於Excel中的sumif函式的功能。下面的程式碼在單列篩選的程式碼後增加了.loan_amnt.sum()的求和欄位,表示對資料表中所有grade列值為B的loan_amnt金額求和。

lc.loc[lc["grade"] == "B",].loan_amnt.sum()

按篩選條件求和_等於
除了包含條件外,也可以對排除某一條件的資料求和。下面的程式碼與之前的正好相反,對資料表中所有grade列值不為B的loan_amnt金額求和。

lc.loc[lc["grade"] != "B",].loan_amnt.sum()

按篩選條件求和__不等於

增加一個篩選條件就變成了Excel中的sumifs函式的功能。下面的程式碼中分別使用了兩個條件對資料表進行篩選,並對最後的loan_amnt金額進行求和。

lc.loc[(lc["grade"] == "B") & (lc["loan_amnt"] > 5000)].loan_amnt.sum()

按篩選條件求和_多條件

按篩選條件計數(countif, countifs)

將前面的.sum()函式換為.count()函式就變成了Excel中的countif函式的功能,下面的程式碼對資料表中grade列值為B的loan_amnt筆數進行計數。

lc.loc[lc["grade"] == "B"].loan_amnt.count()

按篩選條件計數_等於

與前面程式碼相反,下面的程式碼對資料表中grade列值不為B的所有loan_amnt筆數進行計數。

lc.loc[lc["grade"] != "B"].loan_amnt.count()

按篩選條件計數_不等於

增加篩選條件,變成了Excel中的countifs函式的功能,下面的程式碼對資料表中grade列值為B,並且loan_amnt金額額大於5000的loan_amnt筆數進行計數。

lc.loc[(lc["grade"] == "B") & (lc["loan_amnt"] > 5000)].loan_amnt.count()

按篩選條件計數_多條件

按篩選條件計算均值(averageif, averageifs)

有了sumifs和countifs,當然也少不了averageifs,在Pandas中.mean()是用來計算均值的函式,將.sum()和.count()替換為.mean()。就是pandas版的averageif和averageifs。下面的程式碼中計算了資料表中grade列值為B的loan_amnt金額均值。相當於Excel中的averageif函式的功能。

lc.loc[lc["grade"] == "B"].loan_amnt.mean()

按篩選條件計算均值_等於

與前面的程式碼證號相反,下面的程式碼計算了資料表中所有grade列值不為B的loan_amnt金額均值。

lc.loc[lc["grade"] != "B"].loan_amnt.mean()

按篩選條件計算均值_不等於

增加一個篩選條件變成了Excel中的averageifs,不過這裡好像又有一些不同,Excel中的sumifs,countifs和averageifs的計算邏輯是滿足滿足所有指定條件時,才對這些單元格進行求和或計數。而在下面的程式碼中我們使用了或條件,就是說只要滿足兩個條件中的任意一個都會進行計算。

lc.loc[(lc["grade"] == "B") | (lc["loan_amnt"] > 5000)].loan_amnt.mean()

按篩選條件計算均值_多條件或

按篩選條件獲取最大值和最小值

最後兩個是Excel中沒有的函式功能,就是對篩選後的資料表計算最大值和最小值。方法很簡單,將之前的sum()和count()換成max()和min()函式即可。下面是具體的程式碼和結果。

這條程式碼是計算資料表中grade列值為B的loan_amnt最大金額。

lc.loc[lc["grade"] == "B"].loan_amnt.max()

按篩選條件計算最大值

這條程式碼是計算資料表中grade列值不為B的loan_amnt最小金額。

lc.loc[lc["grade"] != "B"].loan_amnt.min()

按篩選條件計算最小值

以上這些也同樣支援多條篩選後的計算,在此就不逐一列出了。

—【所有文章及圖片版權歸 藍鯨(王彥平)所有。歡迎轉載,但請註明轉自“藍鯨網站分析部落格”。】—