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 運算符
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')
源數據框
名稱所在的行 ['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')
源數據框:所有行
名稱不在的選定行 ['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 columnnames has spaces in it
Selected rows wherecountry 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
