網站首頁 編程語言 正文
大多數 Pandas 用戶都熟悉?iloc[]
?和?loc[]
?索引器方法,用于從 Pandas DataFrame 中檢索行和列。但是隨著檢索數據的規則變得越來越復雜,這些方法也隨之變得更加復雜而臃腫。
同時 SQL 也是我們經常接觸且較為熟悉的語言,那么為什么不使用類似于 SQL 的東西來查詢我們的數據呢
事實證明實際上可以使用?query()
?方法做到這一點。因此,在今天的文章中,我們將展示如何使用?query()
?方法對數據框執行查詢
獲取數據
我們使用 kaggle 上的 Titanic 數據集作為本文章的測試數據集,下載地址如下:https://www.kaggle.com/datasets/tedllh/titanic-train
當然也可以在文末獲取到蘿卜哥下載好的數據集
載入數據
下面文末就可以使用 read_csv 來載入數據了
import?pandas?as?pd df?=?pd.read_csv('titanic_train.csv') df
數據集有 891 行和 12 列:
使用 query() 方法
讓我們找出從南安普敦 (‘S’) 出發的所有乘客,可以使用方括號索引,代碼如下所示:
df[df['Embarked']?==?'S']
如果使用?query()
?方法,那么看起來更整潔:
df.query('Embarked?==?"S"')
與 SQL 比較,則 query() 方法中的表達式類似于 SQL 中的 WHERE 語句。
結果是一個 DataFrame,其中包含所有從南安普敦出發的乘客:
query() 方法接受字符串作為查詢條件串,因此,如果要查詢字符串列,則需要確保字符串被正確括起來:
很多時候,我們可能希望將變量值傳遞到查詢字符串中,可以使用 @ 字符執行此操作:
embarked?=?'S' df.query('Embarked?==?@embarked')
或者也可以使用 f 字符串,如下所示:
df.query(f'Embarked?==?"{embarked}"')
就個人而言,我認為與 f-string 方式相比,使用 @ 字符更簡單、更優雅,你認為呢
如果列名中有空格,可以使用反引號 (``) 將列名括起來:
df.query('`Embarked?On`?==?@embarked')
以 In-place 的方式執行 query 方法
當使用 query() 方法執行查詢時,該方法將結果作為 DataFrame 返回,原始 DataFrame 保持不變。如果要更新原始 DataFrame,需要使用 inplace 參數,如下所示:
df.query('Embarked?==?"S"',?inplace=True)
當 inplace 設置為 True 時,query()
?方法將不會返回任何值,原始 DataFrame 被修改。
指定多個條件查詢
我們可以在查詢中指定多個條件,例如假設我想獲取所有從南安普敦 (‘S’) 或瑟堡 (‘C’) 出發的乘客。如果使用方括號索引,這種語法很快變得非常笨拙:
df[(df['Embarked']?==?'S')?|?(df['Embarked']?==?'C')]
我們注意到,在這里我們需要在查詢的條件下引用 DataFrame 兩次,而使用 query() 方法,就簡潔多了:
df.query('Embarked?in?("S","C")')
查詢結果如下
如果要查找所有不是從南安普敦(‘S’)或瑟堡(‘C’)出發的乘客,可以在 Pandas 中使用否定運算符 (~):
df[~((df['Embarked']?==?'S')?|?(df['Embarked']?==?'C'))]
使用?query()
?方法,只需要使用 not 運算符:
df.query('Embarked?not?in?("S","C")')
以下輸出顯示了從皇后鎮 (‘Q’) 出發的乘客以及缺失值的乘客:
說到缺失值,該怎么查詢缺失值呢,當應用于列名時,我們可以使用 isnull() 方法查找缺失值:
df.query('Embarked.isnull()')
現在將顯示 Embarked 列中缺少值的行:
其實可以直接在列名上調用各種 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
比較數值列
我們還可以輕松比較數字列:
df.query('Fare?>?50')
以下輸出顯示了票價大于 50 的所有行:
比較多個列
還可以使用 and、or 和 not 運算符比較多個列,以下語句檢索 Fare 大于 50 和 Age 大于 30 的所有行:
df.query('Fare?>?50?and?Age?>?30')
下面是查詢結果
查詢索引
通常當我們想根據索引值檢索行時,可以使用?loc[]
?索引器,如下所示:
df.loc[[1],:]??#?get?the?row?whose?index?is?1;?return?as?a?dataframe
但是使用 query() 方法,使得事情變得更加直觀:
df.query('index==1')
結果如下
如果要檢索索引值小于 5 的所有行:
df.query('index<5')
結果如下
我們還可以指定索引值的范圍:
df.query('6?<=?index?<?20')
結果如下
比較多列
我們還可以比較列之間的值,例如以下語句檢索 Parch 值大于 SibSp 值的所有行:
df.query('Parch?>?SibSp')
結果如下
總結
從上面的示例可以看出,query()
?方法使搜索行的語法更加自然簡潔,希望感興趣的小伙伴多加練習,真正的達到融會貫通的地步哦~
原文鏈接:https://mp.weixin.qq.com/s/CiMdMWcIiOGFn0N78FDz7g
相關推薦
- 2022-11-21 如何使用正則表達式對輸入數字進行匹配詳解_正則表達式
- 2023-01-13 Go簡單實現協程方法_Golang
- 2022-10-09 淺談C++中各種不同意義的new和delete的使用_C 語言
- 2022-08-16 React?中的?setState?是同步還是異步_React
- 2022-08-06 GIN的路由以及傳參問題_Golang
- 2021-12-05 C++11?關鍵字?const?使用小結_C 語言
- 2022-12-03 SQL?Server如何通過SQL語句直接操作另一臺服務器上的SQL?SERVER的數據_MsSql
- 2022-12-29 解決React報錯You?provided?a?`checked`?prop?to?a?form?f
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支