用SQL操作Pandas DataFrame的三种方式

假如你现在需要对PandasDataFrame进行如下操作:

df[df['Origin'] == 'USA']
.groupby('Origin')
.agg({
    'Miles_per_Gallon': ['sum', 'mean'],
    'Acceleration': ['min', 'max'],
}).reset_index()
df.columns=["Origin",
    "Miles_per_Gallon_sum",
    "Miles_per_Gallon_mean",
    "Acceleration_min",
    "Acceleration_max"]

而如果用SQL来书写,达到上面的处理效果,我们可以写出更优雅和更易于理解的代码:

SELECT
    Origin,
    SUM(Miles_per_Gallon) AS sum_Miles,
    AVG(Miles_per_Gallon) AS avg_Miles,
    MIN(Acceleration) AS min_Acceleration,
    MAX(Acceleration) AS max_Acceleration
FROM df
WHERE Origin = ‘USA’
GROUP BY 1

虽然我们非常喜欢Python,但很明显,对数据进行简单分析时,SQL才是我们最好的朋友,相比于Pandas的聚合函数语法,SQL语法更通俗、直观、便于理解。

接下来,本文将介绍三种使用SQL来操作Pandas DataFrame数据的方法。

假设我们已经有了一个准备好的DataFrame,其中包含你准备好的数据,下面我们开始介绍用SQL语句来查询DataFrame数据的方法。

方法1:使用DuckDB来查询DataFrame

DuckDB是一个开源的内存中的分析型数据库,专为高效处理分析工作负载而设计。它被称为SQLite的分析/OLAP等效工具,因为它提供了类似SQL的查询语言,并支持在Pandas DataFrame上执行SQL查询。

DuckDB是一个强大而灵活的分析型数据库,它的集成性和性能优势使得在Pandas中使用SQL查询变得更加便捷和高效,首先按照通常的方法进行安装:

pip install duckdb
import duckdb

DuckDB中的基准查询:

注意:我们需要明确地将结果转换为DataFrameDuckDB会自动扫描你的内核,寻找属于DataFrame的变量,并让你像查询表一样查询它们。不过这种扫描是在查询运行时发生的,所以你不能使用如DESCRIBE这样的语句:

DuckDB对空白更难处理,反斜线不能解析,所以你需要引用表(DataFrame)的名字,然后是列名(带引号):

DuckDB是专门为OLAP使用案例而设计的数据库引擎,相较于SQLite,它提供了一些在SQLite中不存在的强大功能。一个例子是DuckDBSAMPLE关键字,它使得对数据进行采样变得非常简单,特别适用于处理大型数据集的聚合函数。这一功能在数据分析和探索性数据分析(EDA)中非常有用。

或许,你使用DuckDB而不是SQLite来查询Pandas数据的主要原因是速度。DuckDB声称在分析性查询方面比SQLite快得多,Pandas内置的to_sql和from_sql函数在SQLite中工作得很慢,但在DuckDB中却相当快,在大数据的聚合基准查询中,速度的差异是相当大的。

方法2:使用Pandas .query()方法

你可能已经熟悉了Pandas中的.query()函数。它不完全是SQL,但它可以使一些基本的查询变得更容易,你可以理解它为一个简单的WHERE或.filter()的等价方法。

query()方法的文档比较少,你还可以使用&或者and、or、not等逻辑运算符,以及其它常见的操作符(例如==,<,>,!=等)来连接过滤器:

尽管query()方法提供了方便的语法来筛选DataFrame,但它的表达能力相对有限,某些复杂的查询可能无法使用单个query()表达式解决,需要使用其他方法或技巧来实现。

方法3:使用SmartNoteBook中dfSQL模块来查询DataFrame

SmartNoteBook是一款协作的、集成的、一站式的数据科学/分析环境,其内置的dfSQL方式可以快速实现利用SQL语句对DataFrame进行快速查询。通过dfSQL,用户可以实现利用简单的SQL语句,对Pandas数据框、当前环境下的csv文件以及已经存在的df变量进行访问,除了dfSQL方法也可实现对其它数据源的快速访问,其基本用法如下:

1. 利用dfSQL从DataFrame变量中查询:

在SmartNoteBook中新建的SQL单元格中,数据源我们选择dfSQL,cars变量是前面我们已经读取到变量空间中的DataFrame变量,则我们可以直接利用SQL语句对变量cars进行查询,所查询到的表结果保存为my_cars变量。

2. 利用dfSQL查询环境中的csv文件:

在上述的SQL单元格中,数据源我们选择dfSQL,Iris.csv是存在于本地的一个csv文件,我们可以通过dfSQL,利用SQL语句直接从环境中对其进行读取,并选择我们需要的变量进行聚合,重新保存在一个名为iris的DataFrame变量中。

3. 利用dfSQL进行联合数据分析

在执行SQL语句时,有时为了查到复杂的信息我们往往需要对多表联查或嵌套查询,dfSQL通过在内存中加载保存变量,可以使得其逻辑更具可读性:

上述SQL单元中,我们需要查询每个地区Miles_per_Gallon、Cylinders、Acceleration均大于其地区均值的相关信息。我们可以分为两步,先查出各个地区的相关变量均值,基于保存的df1变量,再从原表中取出满足条件的信息并将其保存名为df2的DataFrame变量。

4. 利用SQL直接访问数据源文件:

实际上在SmartNoteBook的SQL代码模块,其也支持选择数据源,直接对远程数据库进行访问并直接保存为DataFrame变量:

上述SQL单元,我们选择了名为mysql 数据源的远程数据仓库,利用SQL语句直接读取仓库中的信息,并将其保存为名为my_data的DataFrame变量。

dfSQL具有更轻量化,集成优秀的特点,其对接外部数据源不需要再建立复杂的链接,而且可以直接实现对DataFrame变量和本地csv文件的访问。后面执行的SQL查询可以引用NoteBook中之前已执行的SQL查询结果,就像我们写复杂SQL中包含许多CTE(公共表表达式)一样。用户可以使用这种方式将复杂SQL按照逻辑进行拆分,使整个查询过程更具可读性。

展开阅读全文

页面更新:2024-05-20

标签:数据源   变量   语句   函数   操作   简单   方式   环境   数据库   文件   方法   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top