使用Pandas對數(shù)據(jù)進(jìn)行篩選和排序的實現(xiàn)
篩選和排序是Excel中使用頻率最多的功能,通過這個功能可以很方便的對數(shù)據(jù)表中的數(shù)據(jù)使用指定的條件進(jìn)行篩選和計算,以獲得需要的結(jié)果。在Pandas中通過.sort和.loc函數(shù)也可以實現(xiàn)這兩 個功能。.sort函數(shù)可以實現(xiàn)對數(shù)據(jù)表的排序操作,.loc函數(shù)可以實現(xiàn)對數(shù)據(jù)表的篩選操作。本篇文章將介紹如果通過Pandas的這兩個函數(shù)完成Excel中的篩選和排序操作。
首選導(dǎo)入需要使用的Pandas庫和numpy庫,讀取并創(chuàng)建數(shù)據(jù)表,將數(shù)據(jù)表命名為lc。
import pandas as pd import numpy as np lc=pd.DataFrame(pd.read_csv('LoanStats3a.csv',header=1))
創(chuàng)建數(shù)據(jù)表后,開始使用Pandas的.sort函數(shù)對數(shù)據(jù)表進(jìn)行排序操作,下面是Pandas官方對.sort函數(shù)語法和使用方法的說明。.sort函數(shù)主要包含6個參數(shù),columns為要進(jìn)行排序的列名稱, ascending為排序的方式true為升序,F(xiàn)alse為降序,默認(rèn)為true。axis為排序的軸,0表示index,1表示columns,當(dāng)對數(shù)據(jù)列進(jìn)行排序時,axis必須設(shè)置為0。inplace默認(rèn)為False,表示對數(shù)據(jù) 表進(jìn)行排序,不創(chuàng)建新實例。Kind可選擇排序的方式,如快速排序等。na_position對NaN值的處理方式,可以選擇first和last兩種方式,默認(rèn)為last,也就是將NaN值放在排序的結(jié)尾。
在了解了.sort函數(shù)的語法和使用方法后,我們開始使用這個函數(shù)對數(shù)據(jù)進(jìn)行排序操作,數(shù)據(jù)源來自Lending Club 2017-2011年的公開數(shù)據(jù)。首先對單列數(shù)據(jù)進(jìn)行排序。
對單列數(shù)據(jù)進(jìn)行排序
升序
單列數(shù)據(jù)的排序的方法很簡單,按照.sort函數(shù)中的介紹,寫清楚要排序的數(shù)據(jù)表名稱,以及要進(jìn)行排序的列名稱即可。具體的代碼和排序結(jié)果如下所示,其中l(wèi)c是前面我們讀取并創(chuàng)建的數(shù)據(jù)表名稱,loan_amnt是要進(jìn)行排序的列名稱。這里我們對lc數(shù)據(jù)表按loan_amnt列進(jìn)行升序排列。這里需要說明的是ascending參數(shù)的默認(rèn)值是True,也就是升序。因此下面的兩種寫法效果是一樣的 。
lc.sort(["loan_amnt"]) lc.sort(["loan_amnt"],ascending=True)
降序
將ascending參數(shù)的值改為False就完成對數(shù)據(jù)表的降序排列工作。與升序排列的數(shù)據(jù)表相比可以發(fā)現(xiàn)升序排列將loan_amnt列的最小值放在了前面,因此我們可以判斷l(xiāng)oan_amnt的最小金額為500,與之相反,降序排列將最大值放在了前面,因此loan_amnt的最大金額應(yīng)該為35000。這里我們沒有設(shè)置na_position參數(shù)的值,因此按默認(rèn)情況loan_amnt列的NaN值在排序的結(jié)尾顯示。以下顯示了降序排列的代碼和結(jié)果。
lc.sort(["loan_amnt"],ascending=False)
對多列數(shù)據(jù)進(jìn)行排序
除了對單列數(shù)據(jù)進(jìn)行排序以外,.sort函數(shù)還可以對多列數(shù)據(jù)進(jìn)行排序操作。下面我們分別對loan_amnt和int_rate字段進(jìn)行降序排列,以下是具體的代碼和排序結(jié)果,與單列數(shù)據(jù)排序的代碼相比,這里只增加了一個新的列名稱int_rate。
lc.sort(["loan_amnt","int_rate"],ascending=False)
我們將需要排序的兩個列名稱互換位置,再次執(zhí)行降序排列操作。觀察兩次的排序結(jié)果可以發(fā)現(xiàn),這次的結(jié)果與之前的結(jié)果有一些差異。Loan_amnt字段的排序結(jié)果有些混亂,有些較小的值排在了較大值的前面。這是因為第一次排序時loan_amnt是第一排序字段,int_rate是第二排序字段。兩個字段交換位置第二次排序后,int_rate變成了第一排序字段,loan_amnt變成了第二排序字段 。
lc.sort(["int_rate","loan_amnt"],ascending=False)
獲取金額最小前10項
在完成了對數(shù)據(jù)表排序的操作后,我們可以對數(shù)據(jù)表進(jìn)行簡單的篩選,例如獲取loan_amnt金額最小的前10名數(shù)據(jù)。具體的方法是先對lc數(shù)據(jù)表按loan_amnt升序排列,然后取前10名的數(shù)據(jù)。NaN值默認(rèn)在排序結(jié)果的結(jié)尾顯示。以下是具體代碼和結(jié)果。與前面單列升序排列的代碼相比只在結(jié)尾增加了.head()函數(shù)。
lc.sort(["loan_amnt"],ascending=True).head(10)
獲取金額最大前10項
獲取金額最大前10項的代碼與獲取金額最小前10項略有差異,本來我們只需要復(fù)制前面的代碼,然后將.head()函數(shù)改為tail()函數(shù)即可,但由于NaN值在排序的尾部,因此,我們將lc數(shù)據(jù)表按loan_amnt按降序排列,并取排名前10的數(shù)據(jù)。當(dāng)然這并不是唯一的方法,我們還可以通過放棄NaN值的排序或者將NaN值在排序前部顯示來解決這個問題。以下是具體的代碼和執(zhí)行結(jié)果。
lc.sort(["loan_amnt"],ascending=False).head(10)
介紹完排序功能后再來看下篩選,在篩選功能上Pandas使用的是.loc函數(shù)。以下是Pandas官方對.loc函數(shù)的語法和使用方法的說明。
單列數(shù)據(jù)篩選并排序
我們使用.loc對lc數(shù)據(jù)表中g(shù)rade列為B值的數(shù)據(jù)條目進(jìn)行了篩選操作,具體的代碼和篩選結(jié)果如下。在代碼中l(wèi)c.loc[]是.loc函數(shù)的語法,lc[“grade”] == “B”是具體的篩選條件。由于數(shù)據(jù)表較大,因此在最后使用了head()函數(shù)只顯示前5行篩選結(jié)果。從篩選結(jié)果來看grade列的值都為B。
lc.loc[lc["grade"] == "B"].head()
篩選條件除了”等于”(==)以外,還可以使用”不等于”(!=)來排除列中特定的值。我們使用”不等于”來篩選grade列中不是B值的數(shù)據(jù)條目。以下是具體的代碼和篩選結(jié)果,可以看到篩選結(jié)果中的grade列里已經(jīng)不包含B值了。
lc.loc[lc["grade"] != "B"].head()
很多時候我們只關(guān)注數(shù)據(jù)表中某幾列的數(shù)據(jù),這時可以在前面篩選代碼的基礎(chǔ)上增加要顯示的列名稱和顯示順序。下面是具體的代碼和篩選結(jié)果。代碼部分與之前相比增加了要顯示的列名稱 [“member_id”, “l(fā)oan_amnt”, “grade”]。其余部分均沒有改變。在篩選結(jié)果的數(shù)據(jù)表中可以看到僅顯示了我們在代碼中列出的三列。
lc.loc[lc["grade"] == "B", ["member_id", "loan_amnt", "grade"]].head()
若要對篩選結(jié)果進(jìn)行排序可以聯(lián)合使用.loc函數(shù)和.sort函數(shù)。下面的代碼中首先對數(shù)據(jù)表的grade列進(jìn)行篩選,選擇所有值為B的數(shù)據(jù),并限定了結(jié)果中要顯示的三列的名稱。最后對篩選出的結(jié)果按loan_amnt的金額進(jìn)行升序排序。
lc.loc[lc["grade"] == "B", ["member_id", "loan_amnt", "grade"]].sort(["loan_amnt"])
在代碼后面增加ascending參數(shù),并將值設(shè)置為False就可實現(xiàn)對篩選結(jié)果的降序排列。以下為具體的代碼和篩選及排序結(jié)果。
lc.loc[lc["grade"] != "B", ["member_id", "loan_amnt", "grade"]].sort(["loan_amnt"],ascending=False)
多列數(shù)據(jù)篩選并排序
Pandas的.loc參數(shù)還可以同時對多列數(shù)據(jù)進(jìn)行篩選,并且支持不同篩選條件邏輯組合。常用的篩選條件包括”等于”(==)”,不等于”(!),”大于”(>)”,小于”(<)”,大于等于”(>=)” ,小于等于”(<=)等等。邏輯組合包括”與”()和”或”()。下面我們將通過3條多列數(shù)據(jù)篩選代碼逐一進(jìn)行介紹。
第一條代碼使用”與”邏輯,篩選出了grade等于B,并且loan_amnt金額大于5000的數(shù)據(jù)。并限定了顯示的列名稱。從篩選結(jié)果中可以看出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的數(shù)據(jù),同時也限定了顯示的列名稱。從篩選結(jié)果中看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()
第三條代碼使用了”或”邏輯,篩選出了grade列值為B,或loan_amnt列金額大于5000的數(shù)據(jù),同時也限定了顯示的列名稱。從篩選結(jié)果來看,grade列除了B值以外還保留了其他的值,而這些值在loan_amnt列的金額均大于5000。換句話說,一條數(shù)據(jù)只要grade列或loan_amnt列任意之一符合篩選條件,這條數(shù)據(jù)就會被顯示。
lc.loc[(lc["grade"] == "B") | (lc["loan_amnt"] > 5000), ["member_id", "term" , "loan_amnt", "grade","sub_grade", "int_rate"]].head()
多列篩選也可以進(jìn)行排序,方法與單列篩選后排序基本一樣,下面的代碼對多列篩選后的結(jié)果按loan_amnt列進(jìn)行升序排序。由于篩選條件中限定了loan_amnt列的值要大于5000,因此排序的結(jié)果從5020開始。
lc.loc[(lc["grade"] == "B") & (lc["loan_amnt"] > 5000), ["member_id", "term" , "loan_amnt", "grade","sub_grade", "int_rate"]].sort(["loan_amnt"])
對多列篩選結(jié)果進(jìn)行降序排序只需在前面升序排序代碼的基礎(chǔ)上增加ascending參數(shù),并將值設(shè)定為False即可。下面是多列篩選后降序排序的代碼和結(jié)果。
lc.loc[(lc["grade"] == "B") & (lc["loan_amnt"] > 5000), ["member_id", "term" , "loan_amnt", "grade","sub_grade", "int_rate"]].sort(["loan_amnt"],ascending=False)
無論是”與”條件,還是”或”條件都可以在篩選后使用排序。下面代碼是對使用了“或”邏輯條件的篩選結(jié)果進(jìn)行降序排序的代碼和結(jié)果。
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中的排序和篩選基本介紹完了,在實際的分析工作中,篩選只是分析過程中的一個步驟,很多時候我們還需要對篩選后的結(jié)果進(jìn)行匯總,例如求和,計數(shù),或計算均值等等。也就是Excel中常用的sumifs和countifs函數(shù)。
按篩選條件求和(sumif, sumifs)
在單列篩選的代碼后增加求和條件就相當(dāng)于Excel中的sumif函數(shù)的功能。下面的代碼在單列篩選的代碼后增加了.loan_amnt.sum()的求和字段,表示對數(shù)據(jù)表中所有g(shù)rade列值為B的loan_amnt金額求和。
lc.loc[lc["grade"] == "B",].loan_amnt.sum()
除了包含條件外,也可以對排除某一條件的數(shù)據(jù)求和。下面的代碼與之前的正好相反,對數(shù)據(jù)表中所有g(shù)rade列值不為B的loan_amnt金額求和。
lc.loc[lc["grade"] != "B",].loan_amnt.sum()
增加一個篩選條件就變成了Excel中的sumifs函數(shù)的功能。下面的代碼中分別使用了兩個條件對數(shù)據(jù)表進(jìn)行篩選,并對最后的loan_amnt金額進(jìn)行求和。
lc.loc[(lc["grade"] == "B") & (lc["loan_amnt"] > 5000)].loan_amnt.sum()
按篩選條件計數(shù)(countif, countifs)
將前面的.sum()函數(shù)換為.count()函數(shù)就變成了Excel中的countif函數(shù)的功能,下面的代碼對數(shù)據(jù)表中g(shù)rade列值為B的loan_amnt筆數(shù)進(jìn)行計數(shù)。
lc.loc[lc["grade"] == "B"].loan_amnt.count()
與前面代碼相反,下面的代碼對數(shù)據(jù)表中g(shù)rade列值不為B的所有l(wèi)oan_amnt筆數(shù)進(jìn)行計數(shù)。
lc.loc[lc["grade"] != "B"].loan_amnt.count()
增加篩選條件,變成了Excel中的countifs函數(shù)的功能,下面的代碼對數(shù)據(jù)表中g(shù)rade列值為B,并且loan_amnt金額額大于5000的loan_amnt筆數(shù)進(jìn)行計數(shù)。
lc.loc[(lc["grade"] == "B") & (lc["loan_amnt"] > 5000)].loan_amnt.count()
按篩選條件計算均值(averageif, averageifs)
有了sumifs和countifs,當(dāng)然也少不了averageifs,在Pandas中.mean()是用來計算均值的函數(shù),將.sum()和.count()替換為.mean()。就是pandas版的averageif和averageifs。下面的代碼中計算了數(shù)據(jù)表中g(shù)rade列值為B的loan_amnt金額均值。相當(dāng)于Excel中的averageif函數(shù)的功能。
lc.loc[lc["grade"] == "B"].loan_amnt.mean()
與前面的代碼證號相反,下面的代碼計算了數(shù)據(jù)表中所有g(shù)rade列值不為B的loan_amnt金額均值。
lc.loc[lc["grade"] != "B"].loan_amnt.mean()
增加一個篩選條件變成了Excel中的averageifs,不過這里好像又有一些不同,Excel中的sumifs,countifs和averageifs的計算邏輯是滿足滿足所有指定條件時,才對這些單元格進(jìn)行求和或計數(shù)。而在下面的代碼中我們使用了或條件,就是說只要滿足兩個條件中的任意一個都會進(jìn)行計算。
lc.loc[(lc["grade"] == "B") | (lc["loan_amnt"] > 5000)].loan_amnt.mean()
按篩選條件獲取最大值和最小值
最后兩個是Excel中沒有的函數(shù)功能,就是對篩選后的數(shù)據(jù)表計算最大值和最小值。方法很簡單,將之前的sum()和count()換成max()和min()函數(shù)即可。下面是具體的代碼和結(jié)果。
這條代碼是計算數(shù)據(jù)表中g(shù)rade列值為B的loan_amnt最大金額。
lc.loc[lc["grade"] == "B"].loan_amnt.max()
這條代碼是計算數(shù)據(jù)表中g(shù)rade列值不為B的loan_amnt最小金額。
lc.loc[lc["grade"] != "B"].loan_amnt.min()
以上這些也同樣支持多條篩選后的計算,在此就不逐一列出了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Pytorch搭建yolo3目標(biāo)檢測平臺實現(xiàn)源碼
這篇文章主要為大家介紹了Pytorch搭建yolo3目標(biāo)檢測平臺實現(xiàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Python內(nèi)置函數(shù)—vars的具體使用方法
本篇文章主要介紹了Python內(nèi)置函數(shù)—vars的具體使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12