如何在 Pandas 中以 SQL 查询样式选择数据子集?
简介
在这篇文章中,我将向您展示如何使用 Pandas 进行 SQL 样式过滤数据分析。大多数公司的数据都存储在需要 SQL 来检索和操作的数据库中。例如,像 Oracle、IBM、Microsoft 这样的公司都有自己的数据库和自己的 SQL 实现。
数据科学家必须在职业生涯的某个阶段处理 SQL,因为数据并不总是存储在 CSV 文件中。我个人更喜欢使用 Oracle,因为我公司的大部分数据都存储在 Oracle 中。
场景 – 1 假设我们被赋予一项任务,即根据以下条件从电影数据集中找出所有电影。
- 电影的语言应为英语 (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:布尔索引
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 ]
| title | original_language | status | popularity | vote_count |
|---|---|---|---|---|
| 95 Interstellar | en | Released | 724.247784 | 10867 |
| 788Deadpool | en | Released | 514.569956 | 10995 |
方法 2:.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
| budget | id | original_language | original_title | popularity | release_date | revenue | runtime | st | |
|---|---|---|---|---|---|---|---|---|---|
| 95 | 165000000 | 157336 | en | Interstellar | 724.247784 | 5/11/2014 | 675120017 | 169.0 | Rele |
| 788 | 58000000 | 293660 | en | Deadpool | 514.569956 | 9/02/2016 | 783112979 | 108.0 | Rele |
还有更多,在我的编码中,我经常在“in”子句中检查多个值。因此,上述语法并不理想。可以使用 at 符号 (@) 引用 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
| budget | id | original_language | original_title | popularity | release_date | revenue | runtime | st | |
|---|---|---|---|---|---|---|---|---|---|
| 95 | 165000000 | 157336 | en | Interstellar | 724.247784 | 5/11/2014 | 675120017 | 169.0 | Rele |
| 788 | 58000000 | 293660 | en | Deadpool | 514.569956 | 9/02/2016 | 783112979 | 108.0 | Rele |
有用资源
mysql 参考教程 - 该教程包含有关 mysql 的更多信息:https://www.cainiaomax.com/mysql/

