SQL操作Pandas DataFrame的三种方式示例详解
作者:新语数据故事汇
Pandas的DataFrame操作
假如你现在需要对Pandas的DataFrame进行如下操作:
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中的基准查询:
注意:我们需要明确地将结果转换为DataFrame,DuckDB会自动扫描你的内核,寻找属于DataFrame的变量,并让你像查询表一样查询它们。不过这种扫描是在查询运行时发生的,所以你不能使用如DESCRIBE这样的语句:
DuckDB对空白更难处理,反斜线不能解析,所以你需要引用表(DataFrame)的名字,然后是列名(带引号):
DuckDB是专门为OLAP使用案例而设计的数据库引擎,相较于SQLite,它提供了一些在SQLite中不存在的强大功能。一个例子是DuckDB的SAMPLE关键字,它使得对数据进行采样变得非常简单,特别适用于处理大型数据集的聚合函数。这一功能在数据分析和探索性数据分析(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按照逻辑进行拆分,使整个查询过程更具可读性。
以上就是SQL操作Pandas DataFrame的三种方式示例详解的详细内容,更多关于SQL操作Pandas DataFrame的资料请关注脚本之家其它相关文章!