Pandas 查詢示例 Pandas .query() 方法過濾數據 數據幀中類似 SQL 的查詢


Python 是一種用於進行數據分析的出色語言,主要是因為以數據為中心的 Python 包的奇妙生態系統。Pandas是使導入和分析數據更容易的軟件包之一。

分析數據需要大量的過濾操作。Pandas 提供了許多過濾數據框的方法,它Dataframe.query()就是其中之一。

 注意極客!通過Python 編程基礎課程鞏固您的基礎並學習基礎知識。  

首先,您的面試准備通過Python DS課程增強您的數據結構概念要開始您的機器學習之旅,請加入機器學習 - 基礎課程

語法: DataFrame.query(expr, inplace=False, **kwargs)

參數:
expr:過濾數據的字符串形式的表達式。
就地:如果 True
kwargs:其他關鍵字參數,則在原始數據框中進行更改

返回類型:過濾后的數據框

要下載使用的 CSV 文件,請單擊此處。

注意: Dataframe.query()方法僅在列名沒有任何空格時才有效。所以在應用該方法之前,列名中的空格被替換為“_”

示例 #1:單條件過濾

在這個例子中,數據是根據單一條件過濾的。在應用 query() 方法之前,列名中的空格已被替換為“_”。

 
# importing pandas package
import pandas as pd
  
# making data frame from csv file 
data = pd.read_csv("employees.csv")
  
# replacing blank spaces with '_' 
data.columns =[column.replace(" ", "_") for column in data.columns]
  
# filtering with query method
data.query('Senior_Management == True', inplace = True)
  
# display
data

 

輸出:
如輸出圖像所示,數據現在只有高級管理為真的行。

 
示例 2:多條件過濾

在此示例中,數據幀已在多個條件下進行過濾。在應用 query() 方法之前,列名中的空格已被替換為“_”。

 
# importing pandas package
import pandas as pd
  
# making data frame from csv file 
data = pd.read_csv("employees.csv")
  
# replacing blank spaces with '_' 
data.columns =[column.replace(" ", "_") for column in data.columns]
  
# filtering with query method
data.query('Senior_Management == True 
            and Gender =="Male" and Team =="Marketing" 
            and First_Name =="Johnny"', inplace = True)
  
# display
data

 

輸出:
如輸出圖像所示,根據應用的過濾器只返回了兩行。

 

為什么使用查詢

因為它使您能夠就地創建視圖和過濾器。

對於數值運算,它也比純 python 更快。1

import pandas as pd # using filters needs two steps # one to assign the dataframe to a variable df = pd.DataFrame({ 'name':['john','david','anna'], 'country':['USA','UK',np.nan] }) # another one to perform the filter df[df['country']=='USA'] 

但是您可以在一個步驟中定義數據幀並對其進行查詢(內存會立即釋放,因為您沒有創建任何臨時變量)

# this is equivalent to the code above # and uses no intermediate variables pd.DataFrame({ 'name':['john','david','anna'], 'country':['USA','UK',np.nan] }).query("country == 'USA'") 
 

Python變量

在查詢中引用外部變量,請使用@variable_name

import pandas as pd import numpy as np df = pd.DataFrame({ 'name':['john','david','anna'], 'country':['USA','UK',np.nan], 'age':[23,45,45] }) target_age = 45 df.query('age == @target_age') 

或運算符

只需使用or不要忘記括號。

import pandas as pd df = pd.DataFrame({ 'name':['john','david','anna'], 'country':['USA','UK', 'USA'], 'age':[23,45,45] }) df.query("(name=='john') or (country=='UK')") 

 

源數據框 之前:源數據框
  
后過濾器或運算符 之后:只有 name'john'
或 country 的'UK'

 

AND 運算符

只需使用and不要忘記括號。

import pandas as pd df = pd.DataFrame({ 'name':['john','david','anna'], 'country':['USA','UK', 'USA'], 'age':[23,45,45] }) df.query("(country=='USA') and (age==23)") 

 

源數據框 包含所有行的源數據框
  
后加運算符過濾器 之后:只有一行有
country='USA'
age =23

 

多重條件

有關更多示例,請參閱上面的and 運算符或運算符

  • 示例: AND 運算符

df.query((col1 == 1) and (col2 == 2))

  • 示例: OR 運算符

df.query((col1 == 1) or (col2 == 2))

數組中的值

將值放入 python 數組中並使用in @myvar

import pandas as pd df = pd.DataFrame({ 'name':['john','david','anna'], 'country':['USA','UK', 'USA'], 'age':[23,45,45] }) names_array = ['john','anna'] df.query('name in @names_array') 

 

源數據框 源數據框
  
where-column-is-in-array 名稱所在的行 ['john', 'anna']

 

 

不在數組中

將值放入 python 數組中並使用not in @myvar

import pandas as pd df = pd.DataFrame({ 'name':['john','david','anna'], 'country':['USA','UK', 'USA'], 'age':[23,45,45] }) invalid_array = ['anna'] df.query('name not in @invalid_array') 

 

源數據框 源數據框:所有行
  
where-column-not-in-array 名稱不在的選定行 ['anna']

 

轉義列名

轉義特殊字符(例如空格),請將列名稱括在反引號中:'`'

df = pd.DataFrame({ 'name':['john','david','anna'], 'country of birth':['USA','UK', 'USA'], 'age':[23,45,45] }) df.query('`country of birth` == "UK"') 

 

源數據框 Source dataframe: one of the column
names has spaces in it
  
過濾后列名稱空間 Selected rows where
country of origin equals 'UK'

 

Is null

To filter the dataframe where a column value is NULL, use .isnull()

import pandas as pd import numpy as np df = pd.DataFrame({ 'name':['john','david','anna'], 'country':['USA','UK',np.nan] }) df.query('country.isnull()') 

 

原始數據框 Original Dataframe
         
查詢何處為空 Equivalent to:
"where country is NULL"

Is not null

Use .notnull()

import pandas as pd import numpy as np df = pd.DataFrame({ 'name':['john','david','anna'], 'country':['USA','UK',np.nan] }) df.query('country.notnull()') 

 

原始數據框 Original Dataframe
         
查詢何處為空 Equivalent to:
"where country is NOT NULL"

 

Like

Although like is not supported as a keyword in query, we can simulate it using col.str.contains("pattern"):

import pandas as pd df = pd.DataFrame({ 'col1':['foo','bar','baz','quux'] }) df.query('col1.str.contains("ba")') 

 

源數據框 Source dataframe
  
類似查詢后 Result: filter where col1 matches "ba"

 


1 It uses numexpr under the hood: https://github.com/pydata/numexpr

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM