使用 Pandas read_sql 将 SQL 查询/表读入 DataFrame

2023-10-20

The read_sql函数允许您将数据从 SQL 数据库直接加载到Pandas数据框。

它允许您直接解析和执行 SQL 查询或将整个表读入数据框。通过使用pandas.read_sql,您正在 SQL 数据库和 Pandas 之间建立无缝桥梁。

 

 

Pandas read_sql 函数的语法

的基本语法read_sqlPandas 中的函数如下:


pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)
  

以下是每个参数的含义:

  • sql:该参数可以是要执行的字符串 SQL 查询或 SQLalchemy Selectable(表示已编译的 SQL 语句)。
  • con:这是您的数据库连接对象,可以是 SQLAlchemy 引擎或 sqlite3 连接。
  • index_col:可选参数,指定要设置为索引的列。
  • coerce_float:当设置为 True(默认)时,它会尝试将非字符串数据转换为浮点数。
  • params:要传递到的参数的可选列表或字典sql query.
  • parse_dates:一个可选参数,用于将列解析为日期时间。
  • columns:如果您正在读取表(而不是查询),这允许您选择要加载的列。
  • chunksize:如果指定的话,read_sql将返回一个迭代器,其中 chunksize 是每个块的行数。

 

建立连接

在熊猫中read_sql函数中,您可以通过多种方式建立与 SQL 数据库的连接。然而,最常见的两种方式是:

使用sqlite3连接

如果您正在与SQLite数据库,也可以直接使用sqlite3连接。这是一个例子:


import sqlite3
import pandas as pd
con = sqlite3.connect('school_db.sqlite')  

使用 SQLAlchemy 引擎

您可以创建一个 SQLAlchemy 引擎并将其用作连接参数read_sql功能。此方法的优点是能够使用许多不同类型的 SQL 数据库。

首先,您需要安装 SQLAlchemy 引擎:


pip install sqlalchemy  

下面是连接到 SQLite 数据库的示例:


from sqlalchemy import create_engine
import pandas as pd
engine = create_engine('sqlite:///school_db.sqlite')
  

MySQL

要连接到 MySQL 数据库,您需要安装 mysql-connector-python 包,它是 Python 的 MySQL 连接器,SQLAlchemy 将使用它与 MySQL 服务器进行通信:


pip install mysql-connector-python  

安装连接器后,您可以为 MySQL 数据库创建引擎:


from sqlalchemy import create_engine
engine = create_engine('mysql+mysqlconnector://USERNAME:PASSWORD@HOST/DB_NAME')  

PostgreSQL

对于 PostgreSQL,您需要使用 psycopg2-binary 包,它是最流行的 Python PostgreSQL 适配器。


pip install psycopg2-binary  

安装适配器后,您可以为 PostgreSQL 数据库创建引擎:


from sqlalchemy import create_engine
engine = create_engine('postgresql+psycopg2://USERNAME:PASSWORD@HOST/DB_NAME')
  

Oracle

要使用 Python 与 Oracle 数据库交互,我们可以利用 cx_Oracle 库。
首先,您需要使用 pip 安装 cx_Oracle 包:


pip install cx_Oracle  

安装cx_Oracle后,您可以建立与Oracle数据库的连接:


from sqlalchemy import create_engine
engine = create_engine('oracle+cx_oracle://USERNAME:PASSWORD@HOST:PORT/DB_NAME')
  

 

基本SQL数据库Queries

首先,您需要导入必要的库并建立与数据库的连接:


import pandas as pd
import sqlite3
con = sqlite3.connect("school_database.db")
  

现在,我们假设数据库中有一个名为“users”的表。我们可以用read_sql将整个“users”表加载到 DataFrame 中:


df = pd.read_sql("SELECT * FROM users", con)
con.close()
print(df.head())
  

Output:


   id     name  age
0   1    Alice   20
1   2      Bob   22
2   3  Charlie   19
3   4    David   21
4   5     Emma   20
  

在上面的代码中,我们执行了 SQL 查询“SELECT * FROM users”,该查询从“users”表中选择所有列和行。
The read_sql函数执行此查询并将结果加载到 Pandas 数据框中,df.
在通过调用读取数据后,我们不会忘记关闭连接con.close()以避免资源消耗。
The df.head()然后函数打印数据帧的前 5 行。

 

读取表数据

The read_sqlPandas 中的函数允许我们使用上面看到的 SQL 查询字符串或表名,将数据从 SQL 数据库获取到 DataFrame 对象中。
当我们向read_sql函数,它将读取整个表并将其转换为 DataFrame。

让我们通过一个例子来看看如何做到这一点。假设我们的数据库中有一个名为“students”的表。


df = pd.read_sql('students', con)
con.close()
print(df.head())
  

Output:


   id     name  age  grade
0   1    Alice   20     10
1   2      Bob   22     11
2   3  Charlie   19     10
3   4    David   21     12
4   5     Emma   20     11
  

在此示例中,我们使用read_sql使用“students”表作为 SQL 查询的函数。该函数从“students”表中获取所有行并将它们转换为 DataFrame。

 

过滤行

Pandas’ read_sql允许您运行 SQL 查询,这意味着您可以添加WHERE根据特定条件过滤行的子句。

让我们继续使用“users”表并将其过滤为仅包含年龄超过 20 岁的用户:


df = pd.read_sql("SELECT * FROM users WHERE age > 20", con)
con.close()
print(df)
  

Output:


   id   name  age
0   2    Bob   22
1   4  David   21
  

在此代码中,我们执行 SQL 查询“SELECT * FROM users WHEREage > 20”。此查询从“users”表中选择所有列,但仅选择“age”大于 20 的行。

The read_sql然后函数执行此查询并将结果加载到数据框中df.
我们还可以添加多个条件。

例如,让我们过滤“users”表以仅包含年龄超过 20 岁且姓名以“D”开头的用户:


df = pd.read_sql("SELECT * FROM users WHERE age > 20 AND name LIKE 'D%'", con)
con.close()
print(df)
  

Output:


   id   name  age
0   4  David   21
  

在此代码中,SQL 查询“SELECT * FROM users WHEREage > 20 AND name LIKE 'D%'”从 'users' 表中选择所有列,但仅选择 'age' 大于 20 且 'name' 的行' 以 'D' 开头。

The read_sql函数执行此查询并将结果加载到数据框中df.

 

提取特定列

您可以使用columns中的参数read_sql如果您不想读取整个表而只想读取特定列,请使用此函数。

这是一种仅加载您需要的数据的简单而有效的方法。
让我们继续我们的“users”表并仅提取“name”和“age”列:


df = pd.read_sql('users', engine, columns=['name', 'age'])
con.close()
print(df.head())
  

Output:


      name  age
0    Alice   20
1      Bob   22
2  Charlie   19
3    David   21
4     Emma   20
  

在此代码中,read_sql函数仅读取“users”表中的“name”和“age”列。其余代码的工作方式与以前相同。

 

设置DataFrame索引

The index_col的参数read_sql函数指定哪一列应用作 DataFrame 的索引。

让我们考虑一个示例,其中有一个“students”表,其中有一个“id”列,我们希望将其用作索引:


df = pd.read_sql("SELECT * FROM students", con, index_col='id')
con.close()
print(df.head())
  

Output:


      name  age  grade
id                     
1    Alice   20     10
2      Bob   22     11
3  Charlie   19     10
4    David   21     12
5     Emma   20     11
  

在此代码中,我们使用pd.read_sql执行 SQL 查询“SELECT * FROM Students”并将结果加载到 pandas 数据框中。

我们还设置了index_col='id'使用学生表中的“id”列作为 DataFrame 的索引。

 

参数化查询

在防止 SQL 注入攻击和创建动态查询方面,参数化查询是一个至关重要的功能。

The read_sqlpandas 中的函数通过以下方式支持参数化查询params争论。
让我们考虑一个场景,我们需要根据用户年龄过滤“users”表,但具体年龄将在运行时决定。我们可以通过以下方式实现这一目标:


age_to_filter = 20
df = pd.read_sql("SELECT * FROM users WHERE age > ?", con, params=[age_to_filter])
con.close()
print(df)
  

Output:


   id   name  age
0   2    Bob   22
1   4  David   21
  

在此代码中,我们执行 SQL 查询“SELECT FROM users WHEREage > ?”,其中“?”是一个占位符,将被替换params争论。

我们通过age_to_filter变量作为params争论。

因此,执行的 SQL 查询是“SELECT FROM users WHEREage > 20”,它选择“users”表中“age”大于 20 的所有列。

The read_sql函数执行此查询并将结果加载到数据框中df.
我们还可以使用字典或者元组来传递参数:


df = pd.read_sql("SELECT * FROM users WHERE age > :age_to_filter", con, params={"age_to_filter": 20})
con.close()
print(df)
  

Output:


   id   name  age
0   2    Bob   22
1   4  David   21
  

在这种情况下,SQL 查询使用命名占位符“:age_to_filter”,该占位符被替换为params字典。

 

解析日期列

您可以使用parse_dates的参数read_sql函数来解析日期列,这是因为 Pandas 默认将日期列加载为对象。

The parse_dates参数接受要解析为日期的列列表。

让我们考虑一个例子,其中有一个带有“dob”(出生日期)列的“students”表:


df = pd.read_sql("SELECT * FROM students", con, parse_dates=['dob'])
con.close()
print(df.head())
print("\nData type of 'dob' column:", df['dob'].dtypes)
  

Output:


   id     name        dob  grade
0   1    Alice 2003-05-15     10
1   2      Bob 2001-06-20     11
2   3  Charlie 2004-09-10     10
3   4    David 2002-11-25     12
4   5     Emma 2003-08-05     11

Data type of 'dob' column: datetime64[ns]
  

一旦“dob”列采用日期时间格式,您就可以对此列执行各种日期时间操作。

例如,您可以提取出生年份、计算年龄、选择特定日期之间的行等等。

 

使用块处理大型数据集

当处理无法放入内存的大型数据集时,可以使用chunksize参数输入read_sql.

这将返回类型的可迭代对象TextFileReader,允许您分块处理数据。
如果我们有一个很大的“users”表,并且我们希望一次处理 500 行的数据块:


from sqlalchemy import create_engine
engine = create_engine('mysql+mysqlconnector://USERNAME:PASSWORD@HOST/DB_NAME')

#Enable streaming to load only records when Pandas fetch them
con = engine.connect().execution_options( stream_results=True)
chunks = pd.read_sql("SELECT * FROM users", con, chunksize=500)
for chunk in chunks:
    print(chunk)
  

请注意,我们通过设置启用了流媒体stream_results=True当 Pandas 获取记录时仅加载记录,而不是加载所有记录。

您可以根据需要在循环中处理每个块。
假设我们要计算每个块的平均年龄。我们可以修改循环来做到这一点:


chunks = pd.read_sql("SELECT * FROM users", con, chunksize=500)
for i, chunk in enumerate(chunks, start=1):
    avg_age = chunk['age'].mean()
    print(f"Average age for chunk {i}: {avg_age}")
  

这将打印每组 500 行的平均年龄。
Using chunksize是一个功能强大的工具,可让您处理大于机器内存的数据集。

 

执行存储过程

存储过程是 SQL 数据库的一个强大功能。它们是执行特定任务并存储在数据库本身中的 SQL 语句集。

在 Python 中调用存储过程read_sql,您可以将调用编写为常规 SQL 语句。这是一个例子:


df = pd.read_sql("CALL get_students_by_age(20)", con)
con.close()
print(df.head())
  

在此代码中,我们使用 SQLCALL执行存储过程的语句get_students_by_age,传递 20 作为参数。

存储过程的结果被加载到 Pandas DataFrame 中df.
Note:调用存储过程的具体语法可能会有所不同,具体取决于您使用的 SQL 数据库。

调用存储过程是执行复杂数据库操作的一种非常有效的方法,因为这些操作是直接在数据库服务器上执行的。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Pandas read_sql 将 SQL 查询/表读入 DataFrame 的相关文章

随机推荐

  • 如何设置 SFTP Chroot Jail

    如果您是管理 Linux 服务器的系统管理员 您可能需要向某些用户授予 SFTP 访问权限 以将文件上传到他们的主目录 默认情况下 可以通过SSH SFTP等方式登录系统的用户SCP可以浏览整个文件系统 包括其他用户的目录 如果这些用户是可
  • 如何在 Linux 中终止进程

    您是否遇到过这样的情况 您启动了一个应用程序 但在使用该应用程序时突然变得无响应并意外崩溃 您尝试再次启动应用程序 但没有任何反应 因为原始应用程序进程从未真正完全关闭 好吧 我们所有人都曾在某个时刻发生过这种事 不是吗 解决方案是终止或终
  • 如何在 CentOS 7 上设置 SSH 密钥

    Secure Shell SSH 是一种加密网络协议 专为客户端和服务器之间的安全连接而设计 两种最流行的 SSH 身份验证机制是基于密码的身份验证和基于公钥的身份验证 使用 SSH 密钥通常比传统的密码身份验证更安全 更方便 本教程介绍如
  • 如何重命名本地和远程 Git 分支

    您正在与一群人合作开发一个项目 并且您已经为 git 分支定义了命名约定 你创建了一个新分支 将更改推送到远程存储库 并意识到您的分支名称不正确 幸运的是 Git 允许您使用以下命令轻松地重命名分支 git branch m命令 本指南介绍
  • 了解 Linux 文件权限

    在 Linux 中 文件权限 属性和所有权控制系统进程和用户对文件的访问级别 这确保只有授权的用户和进程才能访问特定的文件和目录 Linux 文件权限 基本的 Linux 权限模型的工作原理是将每个系统文件与所有者和组相关联 并为三类不同的
  • Python 字符串替换

    在本文中 我们将讨论如何在 Python 中使用replace method replace 方法 在Python中 字符串被表示为不可变的str对象 这str类附带了许多允许您操作字符串的方法 The replace 方法采用以下语法 s
  • 如何在 Ubuntu 18.04 上安装 Sublime Text 3

    崇高的文字是用于 Web 和软件开发的最广泛使用的文本和源代码编辑器之一 它速度非常快 并且具有许多开箱即用的强大功能 您可以通过安装新插件和创建自定义设置来增强其功能 在本教程中 我们将向您展示如何在 Ubuntu 18 04 计算机上安
  • Linux 中的 rmmod 命令

    每个Linux操作系统的核心组件是Linux内核 它管理系统的资源 并充当计算机硬件和软件之间的中介 Linux内核是一个采用模块化设计的软件 内核模块 通常称为驱动程序 是扩展内核功能的一段代码 模块可以编译为可加载模块或内置到内核中 可
  • 如何在 Windows 上创建可启动的 Ubuntu U 盘

    本教程将引导您完成在 Windows 上创建可启动 Ubuntu U 盘的过程 您可以使用此 U 盘来启动并测试或在任何支持从 USB 启动的计算机上安装 Ubuntu 先决条件 4GB 或更大的 USB 记忆棒驱动器 Microsoft
  • 如何在 CentOS 8 上安装 Ruby

    Ruby 是当今最流行的语言之一 它具有优雅的语法 并且是 Ruby on Rails 框架背后的语言 在本文中 我们将探索在 CentOS 8 上安装 Ruby 的不同方法 我们将展示如何从默认的 CentOS 8 存储库并使用 Rben
  • 如何在 Vim / Vi 中复制、剪切和粘贴

    处理文本文件时 复制 剪切和粘贴文本是最常执行的任务之一 Vim 或其前身 Vi 预装在 macOS 和几乎所有 Linux 发行版上 在您最喜欢的编辑器不可用的情况下 了解 Vim 的基础知识会很有帮助 本文介绍如何在 Vim Vi 编辑
  • 如何创建并列出本地和远程 Git 分支

    分支是软件开发过程的一部分 也是 Git 中最强大的功能之一 分支本质上是指向某个提交的指针 当修复错误或开发新功能时 开发人员正在创建一个新分支 稍后可以将其合并到主代码库中 本文介绍如何创建和列出本地和远程 Git 分支 列出 Git
  • Linux find 命令的高级正则表达式

    The 查找命令Linux 中允许您根据不同的条件在目录层次结构中搜索文件和目录 的一项强大功能find是它使用正则表达式进行搜索的能力 正则表达式 或简称 regex 提供了一种匹配字符串中字符序列的方法 目录 hide 1 正则表达式引
  • Bash While 循环:从基础知识到实际应用

    In Bash 脚本 while 循环用于在指定条件为 true 时执行语句块 基本语法是 while CONDITION do Commands to be executed done 只要 CONDITION 计算结果为 true 循环
  • 使用 Pandas DataFrame iloc 属性进行基于索引的访问

    The iloc财产在Pandas库代表 整数位置 并提供基于整数的索引以按位置进行选择 这意味着您可以通过整数位置选择 DataFrame 中的行和列 在本教程中 我们将介绍使用的各个方面iloc 包括选择单行 多行 特定列 甚至单个单元
  • Python defaultdict 简介:类固醇词典

    在Python中 defaultdict是一个类似于字典的类collections模块允许我们为字典中未显式设置的键定义默认值 它是内置的子类dict class Both dict and defaultdict用于以键值对格式 Pyth
  • 19 个有用的 Linux 命令行提示和技巧

    您可能已经注意到 Linux 是一个非常复杂的操作系统 因此 当发生的事情太多时 工作可能会变得有点乏味 但这正是 Linux 的自然之美的闪光点 有许多技巧和快捷方式可以在命令行中使用 以提供额外的便利 这一系列的技巧包括方便的命令和巧妙
  • Python 编程基础知识与示例

    Python 是一种流行且功能强大的脚本语言 可以做任何事情 您可以执行网页抓取 网络工具 科学工具 Raspberry Pi 编程 Web 开发 视频游戏等等 通过Python编程 无论您使用什么平台 您甚至可以进行系统编程 说到机器学习
  • 退出/终止 Python 脚本(简单示例)

    今天 我们将深入探讨退出 终止 Python 脚本的主题 您可以使用您选择的 IDE 但这次我将使用 Microsoft 的 Linux Subsystem for Windows WSL 软件包 有关该功能以及如何在 Windows 10
  • 使用 Pandas read_sql 将 SQL 查询/表读入 DataFrame

    The read sql函数允许您将数据从 SQL 数据库直接加载到Pandas数据框 它允许您直接解析和执行 SQL 查询或将整个表读入数据框 通过使用pandas read sql 您正在 SQL 数据库和 Pandas 之间建立无缝桥