數據過濾在數據分析過程中具有極其重要的地位,因為在真實世界的數據集中,往往存在重覆、缺失或異常的數據。pandas提供的數據過濾功能可以幫助我們輕鬆地識別和處理這些問題數據,從而確保數據的質量和準確性。 今天介紹的query函數,為我們提供了強大靈活的數據過濾方式,有助於從複雜的數據集中提取有價值的 ...
數據過濾在數據分析過程中具有極其重要的地位,因為在真實世界的數據集中,往往存在重覆、缺失或異常的數據。pandas
提供的數據過濾功能可以幫助我們輕鬆地識別和處理這些問題數據,從而確保數據的質量和準確性。
今天介紹的query
函數,為我們提供了強大靈活的數據過濾方式,有助於從複雜的數據集中提取有價值的信息,提高分析的效率。
1. 準備數據
下麵的示例中使用的數據採集自鏈家網的真實房屋成交數據。
數據下載地址:https://databook.top/。
導入數據:
import pandas as pd
fp = "D:/data/南京二手房交易/南京建鄴區.csv"
df = pd.read_csv(fp)
df.head()
2. query 使用示例
query
提供的查詢介面非常靈活,可以用類似sql
的方式組合查詢條件。
2.1. 比較
比較是最常用的過濾手段,
比如:相等比較,檢索2023年3月1日的成交數據。
df.query('dealDate == "2023.03.01"').head()
同樣,也可以進行大於或者小於的比較:
# 成交總價大於1000萬的房屋
df.query('totalPrice > 1000').head()
# 成交總價小於100萬的房屋
df.query('totalPrice < 100').head()
2.2. 多條件組合
在query
函數中組合查詢條件也非常簡單,它的查詢字元串中可以直接使用邏輯運算符。
比如,邏輯與的查詢,用 &
來連接查詢條件。
# 總價大於1000萬,且每平米單價小於6萬的房屋
df.query('totalPrice > 1000 & unitPrice < 60000').head()
邏輯或的查詢,用|
來連接查詢條件。
# 總價小於200萬,或者每平米單價小於3萬的房屋
df.query('totalPrice < 200 | unitPrice < 30000').head()
因為是邏輯或,兩個條件滿足一個就行,所以查詢出的數據有總價大於200萬,也有單價大於3萬的數據。
還有一個邏輯非的運算,用 not
關鍵字來表示。
2.3. 模糊查詢
除了比較,也可以對字元串進行模糊查詢,類似sql
中的LIKE
檢索。
比如,查詢名稱包含萬科的樓盤。
# 名稱包含萬科
df.query('name.str.contains("萬科")').head(5)
包含的字元串也支持正則表達式匹配,比如,查詢萬科樓盤中3室的房屋。
df.query('name.str.contains("萬科.*3室")').head(5)
2.4. 匹配列表
查詢時,可以匹配某個列表中的一項,類似於SQL
中的IN
檢索。
比如,查詢任意三個日期的房屋成交信息,且總價大於500萬。
dates = ["2023.02.28", "2022.12.11", "2022.04.10"]
df.query('totalPrice > 600 & dealDate == @dates').head(5)
3. 總結
pandas
的DataFrame
提供了各種過濾檢索數據的方式,與之相比,query
函數允許用戶以字元串的形式對DataFrame
進行查詢操作。
這樣的好處有:
- 直觀易讀:類似SQL的語法,且查詢語句以字元串形式表示,易於理解和閱讀,有助於提高代碼的可讀性
- 靈活性高:支持複雜的查詢條件,可以通過邏輯運算符組合多個條件,也支持模糊的匹配方式
- 減少代碼量:可以減少編寫過濾和條件判斷的代碼量,使代碼更加簡潔
- 易於調試:由於查詢語句以字元串形式表示,因此在調試過程中可以輕鬆地列印和查看查詢條件