使用Pandasql在Pandas中进行SQL查询

本文将介绍Python库Pandasql,并在Pandas中使用SQL进行查询。

长按关注《Python学研大本营》,加入读者群,分享更多精彩

一、简介

SQL是开发者最重要的技能之一。在Python数据分析生态中,Pandas的使用最为广泛。但是,如果不熟悉Pandas,则必须学习Pandas函数(分组、聚合、连接等)。相比之下,使用SQL查询数据帧更加容易。Pandasql库正好可以满足需求!

【Pandasql项目主页】:https://pypi.org/project/pandasql/

二、Pandasql的初始步骤

设置工作环境。

2.1 安装Pandasql

如果使用的是Google Colab,可以使用pip来安装Pandasql并进行相关代码编写:

pip install pandasql

如果在本地机器上使用Python,请确保在专门为该项目创建的虚拟环境中安装了Pandas和Seaborn。可以使用内置的venv软件包创建和管理虚拟环境。

本文在Ubuntu LTS 22.04上运行Python 3.11。因此,以下说明适用于Ubuntu(在Mac上也同样适用)。如果使用的是Windows机器,请按照以下说明来创建和激活虚拟环境。

在项目目录中运行以下命令创建虚拟环境(此处命名为v1):

python3 -m venv v1

然后激活虚拟环境:

source v1/bin/activate

现在安装Pandas、Seaborn和Pandasql:

pip3 install pandas seaborn pandasql

注意:如果尚未安装pip,可以通过运行apt install python3-pip更新系统软件包并安装它。

2.2 sqldf函数

要在Pandas数据帧上运行SQL查询,可以使用以下语法导入并使用sqldf

from pandasql import sqldf
sqldf(query, globals())

其中:

  • query表示想要在Pandas数据帧上执行的SQL查询语句。它应该是一个包含有效SQL查询的字符串。

  • globals()指定了查询中使用的数据帧所在的全局命名空间。

三、使用Pandasql查询Pandas数据帧

首先导入所需的包和从Pandasql导入sqldf函数:

import pandas as pd
import seaborn as sns
from pandasql import sqldf

由于将在数据帧上运行多个查询,因此可以定义一个函数,这样就可以通过将查询作为参数传递来调用它:

# 为运行SQL查询定义可重复使用的函数
run_query = lambda query: sqldf(query, globals())

对于接下来的所有示例,本文将运行run_query函数(该函数在底层使用了sqldf()),在tips_df数据帧上执行SQL查询,然后打印出返回的结果。

3.1 加载数据集

这里,使用内置于Seaborn库中的"tips"数据集。"tips"数据集包含有关餐厅小费的信息,包括总账单、小费金额、付款人的性别、星期几等。

"tips"数据集加载到名为tips_df的数据帧中:

# 将"tips"数据集加载到`pandas`数据帧中
tips_df = sns.load_dataset("tips")

3.2 示例1 - 选择数据

下面是本文的第一个查询,简单的SELECT语句:

# 简单的SELECT查询
query_1 = """
SELECT *
FROM tips_df
LIMIT 10;
"""
result_1 = run_query(query_1)
print(result_1)

如图所示,该查询选择了tips_df数据帧中的所有列,并使用"LIMIT"关键字将输出限制在前10行。这相当于在Pandas中执行tips_df.head(10)

query_1的输出

3.3 示例2 - 根据条件过滤

接下来,编写根据条件过滤结果的查询:

# 根据条件过滤
query_2 = """
SELECT *
FROM tips_df
WHERE total_bill > 30 AND tip > 5;
"""

result_2 = run_query(query_2)
print(result_2)

该查询根据WHERE子句中指定的条件过滤tips_df数据帧。它从tips_df数据帧中选择其中'total_bill'大于30并且'tip'金额大于5的所有列。

运行query_2将得到以下结果:

query_2的输出

3.4 示例3 - 分组和聚合

运行以下查询,以获取按天分组的平均账单金额:

# 分组和聚合
query_3 = """
SELECT dayAVG(total_bill) as avg_bill
FROM tips_df
GROUP BY day;
"""

result_3 = run_query(query_3)
print(result_3)

以下是输出结果:

query_3的输出

可以清楚地看到周末的平均账单金额略高。

再举一个分组和聚合的例子。观察以下查询:

query_4 = """
SELECT dayCOUNT(*) as num_transactions, AVG(total_bill) as avg_bill, MAX(tip) as max_tip
FROM tips_df
GROUP BY day;
"""

result_4 = run_query(query_4)
print(result_4)

查询query_4通过'day'列对tips_df数据帧中的数据进行分组,并为每个分组计算以下聚合函数:

  • num_transactions:交易次数。
  • avg_bill'total_bill'列的平均值。
  • max_tip'tip'列的最大值。

如图所示,得到了按日期分组的上述数量:

query_4的输出

3.5 示例4 - 子查询

接下来添加一个使用子查询的查询示例:

# 子查询
query_5 = """
SELECT *
FROM tips_df
WHERE total_bill > (SELECT AVG(total_bill) FROM tips_df);
"""

result_5 = run_query(query_5)
print(result_5)

其中,

  • 内部子查询计算了tips_df数据帧中'total_bill'列的平均值。
  • 然后,外部查询选择了tips_df数据帧中'total_bill'大于计算得到的平均值的所有列。

运行query_5,得到以下结果:

query_5的输出

3.6 示例5 - 连接两个数据帧

由于目前只有一个数据帧。为了进行简单的连接操作,创建另一个数据帧,如下所示:

# 创建另一个要与`tips_df`连接的数据帧
other_data = pd.DataFrame({
    'day': ['Thur','Fri''Sat''Sun'],
    'special_event': ['Throwback Thursday''Feel Good Friday''Social Saturday','Fun Sunday', ]
})

other_data数据帧将每天与一个特殊事件关联起来。

现在,在共同的'day'列上执行tips_dfother_data数据帧之间的LEFT JOIN

query_6 = """
SELECT t.*, o.special_event
FROM tips_df t
LEFT JOIN other_data o ON t.day = o.day;
"""

result_6 = run_query(query_6)
print(result_6)

以下是连接操作的结果:

query_6的输出

四、总结

本文介绍了如何使用Pandasql在Pandas数据帧上运行SQL查询。尽管在Pandasql中使用SQL查询数据帧变得非常简单,但也存在一些限制。

最主要的限制是,Pandasql比原生Pandas慢几个数量级。本文对此的建议是:如果需要使用Pandas进行数据分析,可以在学习Pandas并快速上手时使用Pandasql来查询数据帧。然后,一旦熟悉了Pandas,可以切换到Pandas或其他的库(类似Polars)。

推荐书单

《SQL语言从入门到精通(软件开发视频大讲堂)》

《SQL语言从入门到精通》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了在开发中使用SQL语言必须掌握的技术。全书分为3篇共18章,内容包括SQL语言基础、SQL查询基础、复杂查询、数据排序、SQL函数的使用、分组统计、子查询、多表查询、添加数据、修改和删除数据、视图、存储过程、触发器、游标、索引、事务、管理数据库与数据表、数据库安全。所有知识都结合具体实例进行介绍,涉及的程序代码给出了详细的注释,读者可以轻松领会SQL语言的精髓,快速提高开发技能。

购买链接:https://item.jd.com/14055972.html

精彩回顾

《使用Pandas进行时间重采样,充分挖掘数据价值》

《使用SQL分析数据科学职业发展趋势》

《使用Python分析时序数据集中的缺失数据》

《8步学会使用Pandas进行数据清洗》

《进步神速,Pandas 2.1中的新改进和新功能》

《使用Python控制和监测Docker容器》

长按关注《Python学研大本营》,加入读者群,分享更多精彩长按访问【IT今日热榜】,发现每日技术热点

相关推荐

  • 为什么说 HTTP/3 正在吞噬世界?
  • 重构“彻底”的百度文库,如何成为内容生产的新起点?
  • 上海内推 | 微软亚洲研究院人工智能与机器学习组招聘研究型实习生
  • ICCV 2023 | 向量也疯狂,卷起2023年的巴黎时尚风暴!
  • 麻瓜数学:数据增强提高大模型数学推理能力,但泛化能力待提升
  • 强化学习在推荐系统的应用
  • 经济转型时期公司和个人的困境——如何进行高质量的转型?
  • 倒计时3天!Apache Doris 首届线下技术峰会即将召开
  • 文心大模型 4.0 发布!李彦宏:相比 GPT-4 毫不逊色
  • OpenAI 悄悄改变核心价值观惹争议:埋头搞 AGI,其他的都是浮云!
  • 抖音同款、2023 必看:火山引擎团队整理的“易复用”的音视频处理经验都在这了
  • 千刀万剐的微服务,我们到底应该如何应对分布式系统的挑战和风险
  • 前端根本不需要构建!“技术邪教” Ruby on Rails 之父再出激进言论引争议
  • 突发!美国又“出手”了!
  • 355亿,深圳最火独角兽要IPO了
  • 鱼皮的编程小圈子
  • 为什么程序员一定要写单元测试?
  • 微软 VSCode 决定放弃Python3.7!
  • PyTorch大更新,速度大幅提升
  • 分享下几个经典的CV和NLP实战项目