Pandas?Query方法使用深度總結(jié)
大多數(shù) Pandas 用戶(hù)都熟悉 iloc[]
和 loc[]
索引器方法,用于從 Pandas DataFrame 中檢索行和列。但是隨著檢索數(shù)據(jù)的規(guī)則變得越來(lái)越復(fù)雜,這些方法也隨之變得更加復(fù)雜而臃腫。
同時(shí) SQL 也是我們經(jīng)常接觸且較為熟悉的語(yǔ)言,那么為什么不使用類(lèi)似于 SQL 的東西來(lái)查詢(xún)我們的數(shù)據(jù)呢
事實(shí)證明實(shí)際上可以使用 query()
方法做到這一點(diǎn)。因此,在今天的文章中,我們將展示如何使用 query()
方法對(duì)數(shù)據(jù)框執(zhí)行查詢(xún)
獲取數(shù)據(jù)
我們使用 kaggle 上的 Titanic 數(shù)據(jù)集作為本文章的測(cè)試數(shù)據(jù)集,下載地址如下:https://www.kaggle.com/datasets/tedllh/titanic-train
當(dāng)然也可以在文末獲取到蘿卜哥下載好的數(shù)據(jù)集
載入數(shù)據(jù)
下面文末就可以使用 read_csv 來(lái)載入數(shù)據(jù)了
import?pandas?as?pd df?=?pd.read_csv('titanic_train.csv') df
數(shù)據(jù)集有 891 行和 12 列:
使用 query() 方法
讓我們找出從南安普敦 (‘S’) 出發(fā)的所有乘客,可以使用方括號(hào)索引,代碼如下所示:
df[df['Embarked']?==?'S']
如果使用 query()
方法,那么看起來(lái)更整潔:
df.query('Embarked?==?"S"')
與 SQL 比較,則 query() 方法中的表達(dá)式類(lèi)似于 SQL 中的 WHERE 語(yǔ)句。
結(jié)果是一個(gè) DataFrame,其中包含所有從南安普敦出發(fā)的乘客:
query() 方法接受字符串作為查詢(xún)條件串,因此,如果要查詢(xún)字符串列,則需要確保字符串被正確括起來(lái):
很多時(shí)候,我們可能希望將變量值傳遞到查詢(xún)字符串中,可以使用 @ 字符執(zhí)行此操作:
embarked?=?'S' df.query('Embarked?==?@embarked')
或者也可以使用 f 字符串,如下所示:
df.query(f'Embarked?==?"{embarked}"')
就個(gè)人而言,我認(rèn)為與 f-string 方式相比,使用 @ 字符更簡(jiǎn)單、更優(yōu)雅,你認(rèn)為呢
如果列名中有空格,可以使用反引號(hào) (``) 將列名括起來(lái):
df.query('`Embarked?On`?==?@embarked')
以 In-place 的方式執(zhí)行 query 方法
當(dāng)使用 query() 方法執(zhí)行查詢(xún)時(shí),該方法將結(jié)果作為 DataFrame 返回,原始 DataFrame 保持不變。如果要更新原始 DataFrame,需要使用 inplace 參數(shù),如下所示:
df.query('Embarked?==?"S"',?inplace=True)
當(dāng) inplace 設(shè)置為 True 時(shí),query()
方法將不會(huì)返回任何值,原始 DataFrame 被修改。
指定多個(gè)條件查詢(xún)
我們可以在查詢(xún)中指定多個(gè)條件,例如假設(shè)我想獲取所有從南安普敦 (‘S’) 或瑟堡 (‘C’) 出發(fā)的乘客。如果使用方括號(hào)索引,這種語(yǔ)法很快變得非常笨拙:
df[(df['Embarked']?==?'S')?|?(df['Embarked']?==?'C')]
我們注意到,在這里我們需要在查詢(xún)的條件下引用 DataFrame 兩次,而使用 query() 方法,就簡(jiǎn)潔多了:
df.query('Embarked?in?("S","C")')
查詢(xún)結(jié)果如下
如果要查找所有不是從南安普敦(‘S’)或瑟堡(‘C’)出發(fā)的乘客,可以在 Pandas 中使用否定運(yùn)算符 (~):
df[~((df['Embarked']?==?'S')?|?(df['Embarked']?==?'C'))]
使用 query()
方法,只需要使用 not 運(yùn)算符:
df.query('Embarked?not?in?("S","C")')
以下輸出顯示了從皇后鎮(zhèn) (‘Q’) 出發(fā)的乘客以及缺失值的乘客:
說(shuō)到缺失值,該怎么查詢(xún)?nèi)笔е的?,?dāng)應(yīng)用于列名時(shí),我們可以使用 isnull() 方法查找缺失值:
df.query('Embarked.isnull()')
現(xiàn)在將顯示 Embarked 列中缺少值的行:
其實(shí)可以直接在列名上調(diào)用各種 Series 方法:
df.query('Name.str.len()?<?20')??#?find?passengers?whose?name?is? ?????????????????????????????????#?less?than?20?characters df.query(f'Ticket.str.startswith("A")')?#?find?all?passengers?whose? ????????????????????????????????????????#?ticket?starts?with?A
比較數(shù)值列
我們還可以輕松比較數(shù)字列:
df.query('Fare?>?50')
以下輸出顯示了票價(jià)大于 50 的所有行:
比較多個(gè)列
還可以使用 and、or 和 not 運(yùn)算符比較多個(gè)列,以下語(yǔ)句檢索 Fare 大于 50 和 Age 大于 30 的所有行:
df.query('Fare?>?50?and?Age?>?30')
下面是查詢(xún)結(jié)果
查詢(xún)索引
通常當(dāng)我們想根據(jù)索引值檢索行時(shí),可以使用 loc[]
索引器,如下所示:
df.loc[[1],:]??#?get?the?row?whose?index?is?1;?return?as?a?dataframe
但是使用 query() 方法,使得事情變得更加直觀:
df.query('index==1')
結(jié)果如下
如果要檢索索引值小于 5 的所有行:
df.query('index<5')
結(jié)果如下
我們還可以指定索引值的范圍:
df.query('6?<=?index?<?20')
結(jié)果如下
比較多列
我們還可以比較列之間的值,例如以下語(yǔ)句檢索 Parch 值大于 SibSp 值的所有行:
df.query('Parch?>?SibSp')
結(jié)果如下
總結(jié)
從上面的示例可以看出,query()
方法使搜索行的語(yǔ)法更加自然簡(jiǎn)潔,希望感興趣的小伙伴多加練習(xí),真正的達(dá)到融會(huì)貫通的地步哦~
到此這篇關(guān)于Pandas Query方法使用深度總結(jié)的文章就介紹到這了,更多相關(guān)Pandas Query方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python?matplotlib調(diào)整坐標(biāo)軸位置、標(biāo)簽位置和標(biāo)簽方向以及X軸刻度標(biāo)簽位置
我們?cè)谟胢atplotlib繪制圖的時(shí)候總是有各種需求,下面這篇文章主要給大家介紹了關(guān)于Python?matplotlib調(diào)整坐標(biāo)軸位置、標(biāo)簽位置和標(biāo)簽方向以及X軸刻度標(biāo)簽位置的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04Python Pandas批量讀取csv文件到dataframe的方法
這篇文章主要介紹了Python Pandas批量讀取csv文件到dataframe的方法,需要的朋友可以參考下2018-10-10在python下實(shí)現(xiàn)word2vec詞向量訓(xùn)練與加載實(shí)例
這篇文章主要介紹了在python下實(shí)現(xiàn)word2vec詞向量訓(xùn)練與加載實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Windows下Python的Django框架環(huán)境部署及應(yīng)用編寫(xiě)入門(mén)
這篇文章主要介紹了Windows下Python的Django框架環(huán)境部署及程序編寫(xiě)入門(mén),Django在Python的框架中算是一個(gè)重量級(jí)的MVC框架,本文將從程序部署開(kāi)始講到hellow world web應(yīng)用的編寫(xiě),需要的朋友可以參考下2016-03-03Python的進(jìn)程,線程和協(xié)程實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了Python進(jìn)程,線程和協(xié)程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03