如何在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
已發行

更新於:2020年11月10日

299 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.