使用Pandasql在Pandas中进行SQL查询

发表于:2023-10-20 09:31

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:学研君    来源: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):
  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将得到以下结果:
  3.4 示例3 - 分组和聚合
  运行以下查询,以获取按天分组的平均账单金额:
  # 分组和聚合
  query_3 = """
  SELECT day, AVG(total_bill) as avg_bill
  FROM tips_df
  GROUP BY day;
  """
  result_3 = run_query(query_3)
  print(result_3)
  以下是输出结果:
  可以清楚地看到周末的平均账单金额略高。
  再举一个分组和聚合的例子。观察以下查询:
  query_4 = """
  SELECT day, COUNT(*) 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'列的最大值。
  如图所示,得到了按日期分组的上述数量:

  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,得到以下结果:
  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_df和other_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)
  以下是连接操作的结果:
  四、总结
  本文介绍了如何使用Pandasql在Pandas数据帧上运行SQL查询。尽管在Pandasql中使用SQL查询数据帧变得非常简单,但也存在一些限制。
  最主要的限制是,Pandasql比原生Pandas慢几个数量级。本文对此的建议是:如果需要使用Pandas进行数据分析,可以在学习Pandas并快速上手时使用Pandasql来查询数据帧。然后,一旦熟悉了Pandas,可以切换到Pandas或其他的库(类似Polars)。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号