目錄
Part 1? 前言
Part 2? Excel 的數(shù)據(jù)篩選與分布統(tǒng)計(jì)
Part 3? Pandas 條件數(shù)據(jù)篩選
1、條件數(shù)據(jù)篩選的不同維度
(1) 比較數(shù)據(jù)值
(2) 是否為空值
(3) 文本內(nèi)容篩選
(4) 數(shù)據(jù)值長度
(5) 日期篩選
(6) 其他
2、復(fù)合條件篩選
Part 4? 總結(jié)
Part 5? Python教程
Part 1? 前言
在 Python 中,第三方庫 Pandas 是數(shù)據(jù)清洗、處理、分析中的主力工具,幾乎所有基于表格數(shù)據(jù)的需求都能在 Pandas 中得到實(shí)現(xiàn),這也是 Python 語言在數(shù)據(jù)分析領(lǐng)域獨(dú)占鰲頭的一大因素。在上期技術(shù)文章中,我們介紹了 Pandas 中的數(shù)據(jù)選取功能,這為我們未來批量處理數(shù)據(jù)打下了良好的基礎(chǔ),本期文章我們將繼續(xù)介紹 Pandas ,學(xué)習(xí)處理表格數(shù)據(jù)十分常用的數(shù)據(jù)篩選功能。在 Excel / WPS 等 office 軟件中,數(shù)據(jù)篩選經(jīng)常被使用到,而Pandas 自然也具備數(shù)據(jù)篩選功能,不僅如此,由于 Pandas 背靠 Python 語言,使得它在字符處理方面具備天然的優(yōu)勢,延伸到數(shù)據(jù)篩選中來,Pandas 則可以憑借正則表達(dá)式對數(shù)據(jù)進(jìn)行隨心所欲、妙不可言的篩選操作,那么究竟妙在哪里呢?下面我們一起來學(xué)習(xí)。
本教程基于 pandas 1.5.3 版本書寫
本文中所有 Python 代碼均在集成開發(fā)環(huán)境 Visual Studio Code (VScode) 中使用交互式開發(fā)環(huán)境 Jupyter Notebook 中編寫,本文分享的代碼請使用 VScode 打開。
點(diǎn)給原文鏈接即可查看如何獲取本文所有演示代碼以及演示用的數(shù)據(jù):
Python 教學(xué) | Pandas 妙不可言的條件數(shù)據(jù)篩選
演示數(shù)據(jù)為 A 股上市公司部分信息(18 個(gè)字段,統(tǒng)計(jì)時(shí)間為 2023年5月12日)
Part 2? Excel 的數(shù)據(jù)篩選與分布統(tǒng)計(jì)
在 Excel / WPS 等辦公軟件中,最基本的數(shù)據(jù)篩選主要以單元格的內(nèi)容為主,以 WPS 為例,選中一列內(nèi)容后,點(diǎn)擊右上方【篩選】,再點(diǎn)擊字段名右下方按鈕就會(huì)彈出按值篩選的篩選框,如下圖所示。
這種以字段內(nèi)容作為條件的數(shù)據(jù)篩選是最基本、常用的一種,在點(diǎn)擊【篩選】后,WPS 會(huì)立即對當(dāng)前字段的所有內(nèi)容做一個(gè)分布統(tǒng)計(jì),顯示每一種取值的數(shù)量和百分比,因此大家也習(xí)慣使用篩選的功能來做字段值的分布統(tǒng)計(jì),說到這里就不得不介紹一下 Pandas 中的字段值統(tǒng)計(jì)操作了,下面是讀取數(shù)據(jù)并統(tǒng)計(jì)上市地點(diǎn)
字段值分布的代碼。
讀取并展示部分?jǐn)?shù)據(jù):
#?導(dǎo)入?pandas
import?pandas?as?pd
#?讀取演示數(shù)據(jù)
data?=?pd.read_excel('./A股上市公司部分信息(截至2023.5.12).xlsx')
#?處理字段名,做簡化處理
data.columns?=?[COL.split('\n')[0]?for?COL?in?list(data.columns)]
#?展示數(shù)據(jù)前兩行
data.head(2)
字段取值數(shù)量統(tǒng)計(jì):統(tǒng)計(jì)上市地點(diǎn)
字段中值的分布
#?數(shù)量統(tǒng)計(jì)
data['上市地點(diǎn)'].value_counts()
#?所得結(jié)果如下圖,A股上市公司上市地點(diǎn)中,值為“深圳”的最多,為?2771
字段取值比率統(tǒng)計(jì):統(tǒng)計(jì)上市地點(diǎn)
字段中值的分布,以比率的形式展現(xiàn)
#?比率統(tǒng)計(jì),在數(shù)量統(tǒng)計(jì)的基礎(chǔ)上加一個(gè)參數(shù)?normalize=True
data['上市地點(diǎn)'].value_counts(normalize=True)
除此之外,如果需要對字段內(nèi)容進(jìn)行片段內(nèi)容查詢,還可以在上圖所示的篩選框中點(diǎn)擊右上方的【文本篩選】進(jìn)行更細(xì)致的篩選。除了查找明確的字符,還可以使用通配符*
和?
進(jìn)行模糊匹配(*
代表任意多個(gè)字符,?
代表任意單個(gè)字符),頗有一些正則表達(dá)式的味道。
在 Pandas 中,類似的數(shù)據(jù)篩選同樣存在,不僅如此,在模糊查找方面,由于 Pandas 中已經(jīng)融入了正則表達(dá)式,所以在文本數(shù)據(jù)的篩選中,可以利用正則表達(dá)式進(jìn)行更加自由、細(xì)致的篩選操作,除此之外,Pandas 還可以從更多的維度來進(jìn)行篩選,下面我們一起來學(xué)習(xí)。
在 Pandas 中,類似的數(shù)據(jù)篩選同樣存在,不僅如此,在模糊查找方面,由于 Pandas 中已經(jīng)融入了正則表達(dá)式,所以在文本數(shù)據(jù)的篩選中,可以利用正則表達(dá)式進(jìn)行更加自由、細(xì)致的篩選操作,除此之外,Pandas 還可以從更多的維度來進(jìn)行篩選,下面我們一起來學(xué)習(xí)。
本文拿 Excel / WPS 與 Pandas 做了數(shù)據(jù)篩選方面的簡單對比,本意不是踩一捧一,而是說明不同工具的差異。如果大家能在這里學(xué)到 Excel / WPS 的實(shí)用操作,這當(dāng)然也是一件好事。
Part 3? Pandas 條件數(shù)據(jù)篩選
在上一期介紹數(shù)據(jù)選取文章中,我們介紹了使用loc
函數(shù)進(jìn)行簡單條件篩選的功能。實(shí)際上除了loc
函數(shù),Pandas 中還有幾個(gè)可以用來數(shù)據(jù)篩選的函數(shù)或形式,比如query
函數(shù)、切片([]
)等。在這些函數(shù)中,筆者認(rèn)為通用性最佳的方式是使用切片([]
)來做數(shù)據(jù)篩選。切片篩選的形式如下。
變量名[<條件表達(dá)式>]
如何使用切片來做數(shù)據(jù)篩選呢?下面我們以上一節(jié)讀取的數(shù)據(jù)data
為例,從不同的維度的篩選條件做介紹。
1、條件數(shù)據(jù)篩選的不同維度
(1) 比較數(shù)據(jù)值
一種最簡單,但又最常見的數(shù)據(jù)篩選條件就是通過判斷一個(gè)字段的值是否等于、不等于指定的值。例如當(dāng)我們想篩選上市地點(diǎn)在北京的A股上市公司數(shù)據(jù),可以使用下面的篩選代碼。
#?篩選上市地點(diǎn)在北京的A股上市公司數(shù)據(jù)
data[data['上市地點(diǎn)']?==?'北京']
代碼中的data['上市地點(diǎn)'] == '北京'
就是篩選的條件,篩選結(jié)果(部分)如下圖所示。
如果想獲取data
中不是在北京上市的企業(yè),那么篩選條件就是上市地點(diǎn)不等于“北京”,編寫代碼時(shí)只需將上述代碼中的等于號(hào)==
改成不等于號(hào)!=
即可,這里不再具體演示。
當(dāng)情況比較多的時(shí)候,例如篩選出城市
字段是北京市、上海市、廣州市、深圳市其中一種的數(shù)據(jù)時(shí),可以使用的方法不止一種,下面是其中一種方法的代碼。
#?篩選出城市字段是北京市、上海市、廣州市、深圳市其中一種的數(shù)據(jù)
data[data['城市'].isin(['北京市',?'上海市',?'廣州市',?'深圳市'])]
上面兩個(gè)案例是根據(jù)內(nèi)容為文本的字段進(jìn)行篩選,如果需要對一個(gè)數(shù)字字段做篩選,我們還可以使用 Python 中的其他比較運(yùn)算符來做篩選,舉個(gè)例子,當(dāng)需要篩選員工總數(shù)大于等于 10000 的A股上市企業(yè)時(shí),可以使用下面的代碼。
#?篩選員工總數(shù)大于等于?10000?的企業(yè)
data[data['員工總數(shù)']?>=?10000]
同理,還可以使用大于、小于、小于等于等比較運(yùn)算符來做數(shù)據(jù)篩選。這些比較數(shù)據(jù)值大小的篩選條件中,除了能拿字段和常量做比較,還可以拿字段和字段作比較,例如我們可以篩選出員工總數(shù)
大于等于所屬行政區(qū)劃代碼
的數(shù)據(jù)(當(dāng)然這個(gè)條件沒有任何實(shí)際意義,這里只是舉一個(gè)例子),可以使用下面的代碼。
#?先將?所屬行政區(qū)劃代碼?字段類型轉(zhuǎn)為數(shù)字型
data['所屬行政區(qū)劃代碼']?=?data['所屬行政區(qū)劃代碼'].astype(int)
#?篩選出員工總數(shù)大于等于所屬行政區(qū)劃代碼的數(shù)據(jù)
data[data['員工總數(shù)']?>=?data['所屬行政區(qū)劃代碼']]
(2) 是否為空值
有些時(shí)候,我們需要根據(jù)某個(gè)字段的值是否為空值來做篩選,比如篩選數(shù)據(jù)data
中所屬上市標(biāo)準(zhǔn)
字段值不為空的數(shù)據(jù),可以使用下面的代碼。
#?篩選所屬上市標(biāo)準(zhǔn)字段值不為空的數(shù)據(jù)
data[data['所屬上市標(biāo)準(zhǔn)'].notna()]
如果需要獲取某字段值為空的數(shù)據(jù),可以將上述代碼中的notna()替換為isna()即可。
Python 中默認(rèn)的空值是 None,在 Pandas 中,表格數(shù)據(jù)中默認(rèn)的空值(或者說缺失值)是?
NaN
,它是 numpy 庫中的常量,意為 Not a Number,由于 Pandas 是以 numpy 庫為基礎(chǔ)開發(fā)的,故在表格數(shù)據(jù)中保留此設(shè)定,將空值設(shè)置為 NaN(numpy.nan)。而isna()
和notna()
?函數(shù)能夠識(shí)別的空值也包括 None 和 NaN,但不包括空字符'',即空字符''
在 pandas 中不屬于空值。
(3) 文本內(nèi)容篩選
正如介紹 Excel / WPS 時(shí)說的那樣,這類辦公軟件可以對某個(gè)字段做文本篩選,篩選字段中包含、不包含、開頭(不)是、結(jié)尾(不)是某關(guān)鍵詞的數(shù)據(jù),除此之外還可使使用一些通配符來做模糊篩選。這種篩選操作在 ?Excel 中已經(jīng)很強(qiáng)大了,但是這些在擁有正則表達(dá)式加持的 Pandas 面前,都算是小菜一碟。下面我們來介紹一下 Pandas 如何根據(jù)字段中的文本內(nèi)容進(jìn)行篩選數(shù)據(jù)。
首先,最簡單的條件就是字段中是否包含(或不包含)某關(guān)鍵詞,例如篩選數(shù)據(jù)data
中公司中文名稱
字段含有關(guān)鍵詞“證券”的企業(yè),可以使用下面的數(shù)據(jù)篩選代碼。
#?篩選數(shù)據(jù)中?公司中文名稱?字段含有關(guān)鍵詞“證券”的企業(yè)
data[data['公司中文名稱'].str.contains('證券')]
#?篩選后得到?41?條符合條件的數(shù)據(jù)
如果希望篩選出所有公司中文名稱
不含關(guān)鍵詞“證券”的數(shù)據(jù),則可以在上面代碼的條件表達(dá)式最前面加一個(gè)波浪符~
,代碼如下(不再展示篩選結(jié)果)。
#?篩選數(shù)據(jù)中?公司中文名稱?字段不含關(guān)鍵詞“證券”的企業(yè)
data[~data['公司中文名稱'].str.contains('證券')]
除了以上這種最基本的關(guān)鍵詞篩選之外,其他的像 Excel 那種根據(jù)文本的開頭或結(jié)尾進(jìn)行篩選的操作,在 Pandas 都可以通過正則表達(dá)式來實(shí)現(xiàn),那么如何在 Pandas 的數(shù)據(jù)篩選中使用正則表達(dá)式呢?很簡單,以上述代碼為例,只需要將正則表達(dá)式傳入contains
函數(shù),取代關(guān)鍵詞即可。例如篩選公司中文名稱
字段中含有“證券”,“銀行”或“保險(xiǎn)” 的數(shù)據(jù)時(shí),就可以使用正則表達(dá)式進(jìn)行處理,代碼如下。
正則表達(dá)式教程已經(jīng)更新完畢,請到文末查找相關(guān)鏈接
#?篩選公司中文名稱字段中含有“證券”,“銀行”或“保險(xiǎn)”?的數(shù)據(jù)
data[data['公司中文名稱'].str.contains('證券|銀行|保險(xiǎn)')]
除此之外,我們還可以使用更加復(fù)雜的正則表達(dá)式進(jìn)行更加復(fù)雜的篩選操作,例如篩選注冊地址
字段中不含有中文的數(shù)據(jù)可以使用下面的代碼來實(shí)現(xiàn)。
#?篩選?注冊地址?字段中不含有中文的數(shù)據(jù)
data[~data['注冊地址'].str.contains('[\u4e00-\u9fa5]')]
根據(jù)文本內(nèi)容做篩選時(shí),有一點(diǎn)需要特別注意,那就是進(jìn)行篩選的字段中,必須所有值都是字符類型,不能是空值(若含有空值,可先填充缺失值為字符型),不能包含數(shù)字型和日期型,因?yàn)檎齽t表達(dá)式無法對這些類型做處理。
(4) 數(shù)據(jù)值長度
有時(shí)候字段中文本的長度也能反映出一些信息,例如注冊地址中字符數(shù)量越多,說明地址的描述越詳細(xì),而Pandas 則可以根據(jù)字符的長度做篩選,例如當(dāng)需要篩選注冊地址
字段中字符數(shù)量小于等于 10 的所有數(shù)據(jù)時(shí),可以使用下面的代碼。
#?篩選注冊地址字段中字符數(shù)量小于等于?10?的所有數(shù)據(jù)
data[data['注冊地址'].str.len()?<?10]
(5) 日期篩選
除了對數(shù)值和字符進(jìn)行篩選,Pandas 也能像 Excel 那樣根據(jù)日期篩選數(shù)據(jù),例如篩選 2023 年新上市的A股企業(yè),就可以使用下面的代碼。
#?先將?上市日期?字段轉(zhuǎn)為?python?中的日期類型
data['上市日期']?=?data['上市日期'].astype('datetime64[ns]')
#?篩選?2023?年新上市的A股企業(yè)
data[data['上市日期']?>=?pd.Timestamp(2023,?1,?1)]
(6) 其他
除了以上介紹的數(shù)據(jù)篩選維度,Pandas 的數(shù)據(jù)篩選還可以有其他的維度,比如根據(jù)索引值、字段名篩選,不過這些知識(shí)點(diǎn)的實(shí)用性算不上高,這就不過多介紹了。
2、復(fù)合條件篩選
大家可能已經(jīng)注意到,上文介紹的數(shù)據(jù)篩選雖然維度不同,但是所有的篩選案例中都只有一個(gè)篩選條件。實(shí)際上 Pandas 的數(shù)據(jù)篩選是可以存在多個(gè)篩選條件(兩個(gè)及兩個(gè)以上)的。當(dāng)存在多個(gè)條件時(shí),每個(gè)條件最好都使用括號(hào)括起來,如果其中兩個(gè)條件時(shí)是“或”關(guān)系,那么使用邏輯或符號(hào)|
來連接它們;如果兩個(gè)條件的關(guān)系是“與”關(guān)系,那么就要用邏輯與符號(hào)&
來連接它們。在 Pandas 中,上文中介紹的所有條件形式都可以進(jìn)行任意的排列組合。下面我們通過幾個(gè)例子來了解如何進(jìn)行復(fù)合條件篩選。
【例 1】篩選出A股上市公司數(shù)據(jù)中,所屬行政區(qū)劃位于“江浙滬”,且員工總數(shù)大于等于 20000 的數(shù)據(jù)。
##?【例 1】篩選出A股上市公司數(shù)據(jù)中,所屬行政區(qū)劃位于“江浙滬”,且員工總數(shù)大于等于 20000?的數(shù)據(jù)。
#?為了方便查看,在代碼中加了幾個(gè)不必要的空格
data[?(data['所屬行政區(qū)劃'].isin(['上海',?'江蘇省',?'浙江省']))?&?(data['員工總數(shù)']?>=?20000)?]
【例 2】篩選出企業(yè)規(guī)模
為大型,或注冊資本
大于等于 10 億的企業(yè)數(shù)據(jù)。
##?【例 2】篩選出企業(yè)規(guī)模為大型,或注冊資本大于等于 10?億的企業(yè)數(shù)據(jù)。
data[(data['企業(yè)規(guī)模']=='大型')?|?(data['注冊資本']?>?1000000000)]
以上就是 Pandas 條件數(shù)據(jù)篩選的內(nèi)容。
Part 4? 總結(jié)
與 Excel / WPS 等辦公軟件一樣,Pandas 也具備多種形式的條件篩選。不僅如此,得益于正則表達(dá)式強(qiáng)大的文本處理力量,Pandas 在篩選功能方面要更加強(qiáng)大,對大數(shù)據(jù)集的支持也要更好。相對而言 Excel / WPS 這些工具在小型數(shù)據(jù)集的處理上要方便一些,總之它們各有長處。條件數(shù)據(jù)篩選是數(shù)據(jù)處理、數(shù)據(jù)分析中的重要一步,希望大家學(xué)習(xí)路上一帆風(fēng)順,下期文章我們將繼續(xù)學(xué)習(xí) Pandas 數(shù)據(jù)處理相關(guān)知識(shí)。
Part 5? Python教程
-
學(xué)習(xí) Python 第一步——環(huán)境安裝與配置
-
Python 基本數(shù)據(jù)類型
-
Python 字符串操作(上)
-
Python 字符串操作(下)
-
Python 變量與基本運(yùn)算
-
組合數(shù)據(jù)類型-列表
-
組合數(shù)據(jù)類型-集合(內(nèi)含實(shí)例)
-
組合數(shù)據(jù)類型 - 字典&元組
-
Python 中的分支結(jié)構(gòu)(判斷語句)
-
Python 中的循環(huán)結(jié)構(gòu)(上)
-
Python 中的循環(huán)結(jié)構(gòu)(下)
-
Python教學(xué) | Python函數(shù)的定義與調(diào)用
-
Python教學(xué) | Python 內(nèi)置函數(shù)
-
Python教學(xué) | 最常用的標(biāo)準(zhǔn)庫之一 —— os
-
Python 教學(xué) | “小白”友好型正則表達(dá)式教學(xué)(一)
-
Python 教學(xué) | “小白”友好型正則表達(dá)式教學(xué)(二)
-
Python 教學(xué) | “小白”友好型正則表達(dá)式教學(xué)(三)
-
Python 教學(xué) | 數(shù)據(jù)處理必備工具之 Pandas(基礎(chǔ)篇)
-
Python 教學(xué) | 數(shù)據(jù)處理必備工具之 Pandas(數(shù)據(jù)的讀取與導(dǎo)出)
-
Python 教學(xué) | Pandas 數(shù)據(jù)索引與數(shù)據(jù)選取文章來源:http://www.zghlxwxcb.cn/news/detail-686139.html
-
本期文章來源地址http://www.zghlxwxcb.cn/news/detail-686139.html
到了這里,關(guān)于Python 教學(xué) | Pandas 妙不可言的條件數(shù)據(jù)篩選的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!