如何在 Pandas 中以 SQL 查询样式选择数据子集?

pandasserver side programmingprogrammingmysql更新于 2026/2/15 22:36:17

简介

在这篇文章中,我将向您展示如何使用 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

有用资源