掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流
Pandas 可以說(shuō)是 在Python數(shù)據(jù)科學(xué)領(lǐng)域應(yīng)用最為廣泛的工具之一。Pandas是一種高效的數(shù)據(jù)處理庫(kù),它以 ??dataframe?? 和 ??series?? 為基本數(shù)據(jù)類(lèi)型,呈現(xiàn)出類(lèi)似excel的二維數(shù)據(jù)。在數(shù)據(jù)處理過(guò)程中,咱們經(jīng)常會(huì)用到數(shù)據(jù)篩選,Pandas 中提供了數(shù)據(jù)篩選的多種方法,這里,來(lái)給大家分享下 在Pandas中應(yīng)用 ??query?? 函數(shù)來(lái)進(jìn)行數(shù)據(jù)篩選。??query?? 函數(shù)的一般用法如下:

創(chuàng)新互聯(lián)建站長(zhǎng)期為1000多家客戶(hù)提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為大觀企業(yè)提供專(zhuān)業(yè)的成都做網(wǎng)站、網(wǎng)站制作,大觀網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
df.query('expression')文中的代碼是在 Jupyter Notebook 中運(yùn)行的(也可以是其他IDE),本次使用的 Pandas 版本是 1.3.0 版,如下:
import pandas as pd
print(f'pandas version: {pd.__version__}')
# pandas version: 1.3.0rc1
在開(kāi)始之前,先創(chuàng)建一份數(shù)據(jù),供后續(xù)使用:
data = {
'brand':['Python數(shù)據(jù)之道','價(jià)值前瞻','菜鳥(niǎo)數(shù)據(jù)之道','Python','Java'],
'A':[10,2,5,20,16],
'B':[4,6,8,12,10],
'C':[8,12,18,8,2],
'D':[6,18,14,6,12],
'till years':[4,1,1,30,30]
}
df = pd.DataFrame(data=data)
df數(shù)據(jù)如下:
篩選 "brand" 列中值為 "Python數(shù)據(jù)之道" 的行,如下:
df.query('brand == "Python數(shù)據(jù)之道"')結(jié)果如下:
說(shuō)明一下,上面代碼中的單引號(hào)和雙引號(hào)是可以互換的,下面的寫(xiě)法,其結(jié)果也是一樣的:
df.query(" brand == 'Python數(shù)據(jù)之道' ")上面用 query 函數(shù)篩選數(shù)據(jù),用下面的方法也是可以實(shí)現(xiàn)的:
df[df['brand']=="Python數(shù)據(jù)之道"]
上面是篩選字符串的值,也可以是篩選數(shù)字,如下:
除了直接通過(guò)等于某個(gè)值來(lái)篩選, query 函數(shù)還支持通過(guò)數(shù)學(xué)表達(dá)式來(lái)進(jìn)行數(shù)據(jù)篩選,包括 ??>??、 ???、 ??+??、 ??-??、 ??*??、 ??/?? 等。
示例如下:
在程序比較長(zhǎng)的時(shí)候,經(jīng)常會(huì)使用變量來(lái)作為篩選條件, query 函數(shù)在使用變量作為判斷標(biāo)準(zhǔn)時(shí),通過(guò)在變量前面添加 ??@?? 符號(hào)來(lái)實(shí)現(xiàn),示例如下:
# 通過(guò)變量來(lái)篩選數(shù)據(jù),在變量前使用 @ 符號(hào)即可
name = 'Python數(shù)據(jù)之道'
df.query('brand == @name')
當(dāng)需要在某列中篩選多個(gè)符合要求的值的時(shí)候,可以通過(guò)列表(list)來(lái)實(shí)現(xiàn),示例如下:
# 需要注意下 雙引號(hào) 和 單引號(hào)的分開(kāi)使用
df.query('brand in ["Python數(shù)據(jù)之道","價(jià)值前瞻"]')
# df.query("brand in ['Python數(shù)據(jù)之道','價(jià)值前瞻']")
有很多情況下,咱們需要通過(guò)多個(gè)條件來(lái)篩選數(shù)據(jù),query 函數(shù)支持多種條件的組合,
&,或 單詞 and|,或 單詞 or示例如下:
當(dāng) dataframe 的列名稱(chēng)中有空格或其他特殊符號(hào)的時(shí)候,需要使用 ??反引號(hào)(backtick mark)??,即鍵盤(pán)ESC鍵下面的按鍵(就是鍵盤(pán)上第二排第一個(gè)按鍵,有‘~’這個(gè)符號(hào)的按鍵) 來(lái)將列名包裹起來(lái),示例如下:
df.query("`till years` < 5")注意,如果使用單引號(hào),將會(huì)報(bào)錯(cuò),如下:
在數(shù)據(jù)篩選后,還可以選擇需要的數(shù)據(jù)列,如下:
以上就是關(guān)于 Pandas 中 query 函數(shù)的主要內(nèi)容介紹,應(yīng)用 query函數(shù)進(jìn)行數(shù)據(jù)篩選,其語(yǔ)言還是比較簡(jiǎn)潔的,尤其是當(dāng)條件比較多的時(shí)候,會(huì)顯得更優(yōu)雅。
比如下面的對(duì)比,假設(shè)都是三個(gè)篩選條件(假設(shè)數(shù)據(jù)量較多,符合的結(jié)果也較多):
沒(méi)有使用query函數(shù)時(shí)?
df[(df['brand']=="Python數(shù)據(jù)之道") & (df['A'] >2) & (df['C'] >4)]
可以看出上面的表達(dá)式是比較長(zhǎng)的,略顯繁瑣。
使用query函數(shù)時(shí)?
df.query(" brand == 'Python數(shù)據(jù)之道' & A>2 & C>4 ")相對(duì)來(lái)說(shuō),使用query 函數(shù)會(huì)顯得更加簡(jiǎn)潔,如果覺(jué)得這個(gè)功能不錯(cuò),就趕緊用起來(lái)吧~~

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流