Pandas - Dataframe 实现 SQL Where

Pandas中的条件筛选:SQL WHERE子句的实现
本文介绍了如何在Pandas中使用类似于SQL的条件筛选操作,如相等(==)、不等(!=)、大于(>)、小于(<)等,以及如何进行范围比较(>=、<=)。通过示例展示了如何根据特定列的值来过滤DataFrame的行,这对于数据处理和分析非常实用。

sql中的where语句的功能非常丰富,常用关键包括 =,<>,>=,<=,>,<,in,not in,isnull,like,and,or等关键字,下面我们就来看看,如果是在pandas中该如何实现。

>>> import pandas as pd
>>> import numpy as np
df = pd.read_excel(r'D:/myExcel/1.xlsx')
>>> df = pd.read_excel(r'D:/myExcel/1.xlsx')
>>> df
  id   name  score grade
0  a    bog   45.0     A
1  c  jiken   67.0     B
2  d    bob   23.0     A
3  b  jiken   34.0     B
4  f   lucy    NaN     A
5  e   tidy   75.0     B

1、==
即判断相等关系,和sql中的=类似

# 获取id中为'a'的行
>>> df[df['id'] =='a']
  id name  score grade
0  a  bog   45.0     A
# 获取score中分数为45的行
>>> df[df['score'] == 45]
  id name  score grade
0  a  bog   45.0     A

2、!=
即表明不相等的关系,和sql中的<>类似

# 获取id中不为'a'的行
>>> df[df['id'] !='a']
  id   name  score grade
1  c  jiken   67.0     B
2  d    bob   23.0     A
3  b  jiken   34.0     B
4  f   lucy    NaN     A
5  e   tidy   75.0     B
# 获取score中不等于45的行
>>> df[df['score'] != 45]
  id   name  score grade
1  c  jiken   67.0     B
2  d    bob   23.0     A
3  b  jiken   34.0     B
4  f   lucy    NaN     A
5  e   tidy   75.0     B

3、>,>=,<,<=
此和sql保持一致

# score需>= 45
>>> df[df['score'] >= 45]
  id   name  score grade
0  a    bog   45.0     A
1  c  jiken   67.0     B
5  e   tidy   75.0     B
# score需> 45
>>> df[df['score'] > 45]
  id   name  score grade
1  c  jiken   67.0     B
5  e   tidy   75.0     B
# score小于45
>>> df[df['score'] < 45]
  id   name  score grade
2  d    bob   23.0     A
3  b  jiken   34.0     B
# score小于等于45
>>> df[df['score'] <= 45]
  id   name  score grade
0  a    bog   45.0     A
2  d    bob   23.0     A
3  b  jiken   34.0     B
<think>我们有一个关于在Pandas DataFrame中执行SQL查询的问题。根据提供的引用,我们可以使用pandasql库来实现这个功能。 引用[1]提到:使用pandasql库可以直接在pandas DataFrame上执行SQL查询。 引用[2]也提到:使用SQL方式打开pandas,即通过pandasql库,我们可以用SQLDataFrame进行操作。 因此,我们可以这样回答用户: 1. 安装pandasql库(如果尚未安装)。 2. 导入pandasql中的sqldf函数。 3. 使用sqldf函数,传入SQL查询字符串,其中可以使用DataFrame作为表名(注意需要将DataFrame注册为临时表,或者在查询中直接使用DataFrame的变量名,具体取决于sqldf的使用方式)。 另外,引用[3]和[4]是关于将DataFrame写入数据库和从数据库读取数据到DataFrame,虽然与问题不直接相关,但说明pandas与数据库的交互有多种方式。 但是,用户的问题很明确:在Pandas DataFrame中执行SQL查询(不经过外部数据库)。所以我们重点介绍pandasql。 步骤: 1. 安装:pip install pandasql 2. 使用示例: 注意:在pandasql中,我们可以将DataFrame视为SQL中的表,然后在查询中直接使用DataFrame的变量名作为表名(注意大小写和特殊字符,通常需要处理,建议使用简单的表名)。 示例代码: from pandasql import sqldf pysqldf = lambda q: sqldf(q, globals()) # 使用globals()可以获取当前环境中的DataFrame变量 然后就可以写SQL查询了。 例如,假设我们有一个DataFrame叫做df,我们可以这样查询: query = "SELECT * FROM df LIMIT 5" result = pysqldf(query) 注意:sqldf函数默认会在一个临时SQLite数据库中创建这些表,执行查询后返回结果为一个新的DataFrame。 另外,如果不想用lambda,也可以直接使用sqldf函数,但需要传递一个包含当前环境变量的字典(如locals()或globals())。 我们也可以这样写: result = sqldf("SELECT * FROM df LIMIT 5;", locals()) 但是,通常为了复用,我们会定义一个函数,如上面的pysqldf。 因此,回答如下:</think>### 如何在 Pandas DataFrame 中执行 SQL 查询 在 Pandas 中执行 SQL 查询主要有两种方法,核心是通过 **pandasql** 库实现: #### 方法 1:使用 pandasql 库(推荐) ```python # 安装库(首次使用) !pip install pandasql # 导入并执行查询 from pandasql import sqldf # 定义查询执行函数 pysqldf = lambda q: sqldf(q, globals()) # 示例:从df_data表中查询age>30的数据 query = """ SELECT name, age, department FROM df_data WHERE age > 30 ORDER BY age DESC """ result = pysqldf(query) ``` **说明**: 1. `sqldf()` 自动将内存中的 DataFrame 注册为 SQLite 虚拟表 2. 表名直接使用 DataFrame 变量名(如 `df_data`) 3. 支持标准 SQL 语法(SELECT/WHERE/JOIN/GROUP BY 等) #### 方法 2:通过 SQLAlchemy 内存数据库 ```python from sqlalchemy import create_engine # 创建内存数据库 engine = create_engine('sqlite:///:memory:') # 写入DataFrame到虚拟表 df_data.to_sql('employee_data', engine, index=False) # 执行SQL查询 result = pd.read_sql("SELECT * FROM employee_data WHERE salary > 5000", engine) ``` #### 两种方法对比 | **特性** | pandasql | SQLAlchemy 内存库 | |------------------|------------------------------|----------------------------| | 安装难度 | 只需安装 pandasql | 需安装 sqlalchemy + 驱动 | | 语法简洁性 | ⭐⭐⭐⭐ (直接使用DF变量名) | ⭐⭐ (需显式注册表) | | 功能完整性 | ⭐⭐⭐ (支持标准SQL) | ⭐⭐⭐⭐ (支持数据库特定语法) | | 执行速度 | 较快(轻量级SQLite) | 中等 | | 适用场景 | 简单查询 | 复杂事务操作 | > **最佳实践建议**: > 对于日常数据分析,优先使用 `pandasql`,其语法更简洁(直接引用 DataFrame 变量名作为表名)[^1][^2];若需执行复杂事务操作(如多表关联更新),可选用 SQLAlchemy 方案[^3][^4]。 --- ### 相关问题 1. 如何将 SQL 查询结果直接保存为新的 DataFrame? 2. pandasql 是否支持窗口函数等高级 SQL 特性? 3. 当 DataFrame 数据量极大时,如何优化 SQL 查询性能? 4. 能否通过 SQL 语句修改 Pandas DataFrame 的原始数据? [^1]: pandasql 允许直接在 DataFrame 上执行 SQL 查询 [^2]: SQL 语法操作 DataFramepandas 原生方法更直观 [^3]: SQLAlchemy 提供跨数据库统一接口 [^4]: `to_sql()`/`read_sql()` 实现 DataFrame 与数据库交互
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值