如何在Pandas中使用SQL查詢風格選擇資料子集?
介紹
在這篇文章中,我將向您展示如何使用Pandas進行SQL風格的過濾資料分析。大多數公司的數劇都儲存在資料庫中,需要使用SQL來檢索和操作它。例如,Oracle、IBM、Microsoft等公司都有自己的資料庫和SQL實現。
資料科學家在職業生涯的某個階段必須處理SQL,因為資料並不總是儲存在CSV檔案中。我個人更喜歡使用Oracle,因為公司的大部分資料都儲存在Oracle中。
場景一 假設我們有一個任務,需要從我們的電影資料集中找到滿足以下條件的所有電影。
- 電影的語言必須是英語(en)或西班牙語(es)。
- 電影的受歡迎程度必須在500到1000之間。
- 電影的狀態必須是已發行。
- 投票數必須大於5000。對於上述場景,SQL語句如下所示。
SELECT
FROM WHERE
title AS movie_title
,original_language AS movie_language
,popularityAS movie_popularity
,statusAS movie_status
,vote_count AS movie_vote_count movies_data
original_languageIN ('en', 'es')
AND status=('Released')
AND popularitybetween 500 AND 1000
AND vote_count > 5000;既然您已經看到了需求的SQL語句,讓我們一步一步地使用pandas來實現它。我將向您展示兩種方法。
方法一:布林索引
1. 將movies_data資料集載入到DataFrame中。
import pandas as pd movies = pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv")為每個條件分配一個變數。
languages = [ "en" , "es" ] condition_on_languages = movies . original_language . isin ( languages ) condition_on_status = movies . status == "Released" condition_on_popularity = movies . popularity . between ( 500 , 1000 ) condition_on_votecount = movies . vote_count > 5000
3. 將所有條件(布林陣列)組合在一起。
final_conditions = ( condition_on_languages & condition_on_status & condition_on_popularity & condition_on_votecount ) columns = [ "title" , "original_language" , "status" , "popularity" , "vote_count" ] # clubbing all together movies . loc [ final_conditions , columns ]
| 標題 | 原始語言 | 狀態 | 受歡迎程度 | 投票數 |
|---|---|---|---|---|
| 95 星際穿越 | en | 已發行 | 724.247784 | 10867 |
| 788 死侍 | en | 已發行 | 514.569956 | 10995 |
方法二:.query()方法。
.query()方法是SQL where子句風格的過濾資料的方式。條件可以作為字串傳遞給此方法,但是列名不能包含任何空格。
如果列名中有空格,請使用python的replace函式將其替換為下劃線。
根據我的經驗,.query()方法應用於較大的DataFrame時,比之前的方法更快。
import pandas as pd movies = pd . read_csv ( "https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv" )
4. 構建查詢字串並執行方法。
請注意,.query方法不適用於跨多行的三引號字串。
final_conditions = ( "original_language in ['en','es']" "and status == 'Released' " "and popularity > 500 " "and popularity < 1000" "and vote_count > 5000" ) final_result = movies . query ( final_conditions ) final_result
| 預算 | ID | 原始語言 | 原始標題 | 受歡迎程度 | 發行日期 | 收入 | 執行時間 | 狀態 | |
|---|---|---|---|---|---|---|---|---|---|
| 95 | 165000000 | 157336 | en | 星際穿越 | 724.247784 | 5/11/2014 | 675120017 | 169.0 | 已發行 |
| 788 | 58000000 | 293660 | en | 死侍 | 514.569956 | 9/02/2016 | 783112979 | 108.0 | 已發行 |
更多的情況是,在我的程式碼中,我有多個值需要在我的“in”子句中檢查。所以上述語法並不適合這種場景。可以使用@符號引用Python變數。
您也可以以程式設計方式建立一個Python列表作為值,並與@一起使用。
movie_languages = [ 'en' , 'es' ] final_conditions = ( "original_language in @movie_languages " "and status == 'Released' " "and popularity > 500 " "and popularity < 1000" "and vote_count > 5000" ) final_result = movies . query ( final_conditions ) final_result
| 預算 | ID | 原始語言 | 原始標題 | 受歡迎程度 | 發行日期 | 收入 | 執行時間 | 狀態 | |
|---|---|---|---|---|---|---|---|---|---|
| 95 | 165000000 | 157336 | en | 星際穿越 | 724.247784 | 5/11/2014 | 675120017 | 169.0 | 已發行 |
| 788 | 58000000 | 293660 | en | 死侍 | 514.569956 | 9/02/2016 | 783112979 | 108.0 | 已發行 |
廣告
資料結構
網路
關係資料庫管理系統(RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP