Python-Dataframe SQL教程
在 Python 中,对pandas.Dataframe
进行 SQL
查询主要有两种操作方式,分别为pandas
的基本操作语句,以及pandasql
库提供的直接对Dataframe
进行
SQL 查询的操作。
虽然 Python
内置了sqlite
数据库模块,但是其与Dataframe
交互不方便,需要将原始数据插入sqlite
后才可以使用
SQL 语句进行查询操作,因此一般还是用上述两种方法来完成 SQL 查询。
sqlite
的操作流程:
1 | import sqlite3 |
两种方式的优缺点: Pandas 基本操作语句 -
优点:不需要额外安装第三方库,大多数场景内置函数都可以满足需求 -
缺点:在有些数据处理计算中不如 SQL
语言简洁易读(如大量的.groupby()
、.sum()
或者.count()
之类),且无法实现部分复杂功能
Pandasql 库 - 优点:直接使用 SQL 语句完成查询操作,易读性高且可移植性好 - 缺点:
Pandasql 库
pandasql
允许您使用 SQL
语法查询pandas.DataFrame
。它的工作原理与R.pandasql
中的sqldf
类似。pandasql
试图为刚接触
Python
或pandas
的人提供一种更熟悉的操作和清理数据的方法。
安装方式
1 | pip install pandasql |
相关文档:https://pypi.org/project/pandasql/
使用方法
pandasql
中使用的主要函数是sqldf
。sqldf
接受
2 个参数: - 一个 SQL 查询字符串 -
一组会话/环境变量(locals()
或globals()
)
一般使用时我们会定义一个简短的 lambda 表达式来使用这个函数:
1
2from pandasql import sqldf
pysqldf = lambda q: sqldf(q, globals())
查询实例
pandasql
使用 SQLite
语法,将自动检测所有的pandas.DataFrame
名称。可以像查询任何常规
SQL 表一样查询它们。
1 | from pandasql import sqldf, load_meat, load_births |
1 | date beef veal pork lamb_and_mutton broilers other_chicken turkey |
Where 条件语句: 1
2
3
4
5q = """SELECT date, veal, lamb_and_mutton
FROM meat
WHERE lamb_and_mutton >= veal
ORDER BY date DESC;"""
print pysqldf(q).head()1
2
3
4
5 date veal lamb_and_mutton
0 2012-11-01 00:00:00 10.1 12.4
1 2012-10-01 00:00:00 10.3 14.2
2 2012-09-01 00:00:00 8.8 12.5
3 2012-08-01 00:00:00 10.1 14.2
Join 连接语句: 1
2
3
4
5q = """SELECT m.date, m.beef, b.births
FROM meats m
INNER JOIN births b
ON m.date = b.date;"""
print pysqldf(q).head()1
2
3
4
5
6 date beef births
403 2012-07-01 00:00:00 2200.8 368450
404 2012-08-01 00:00:00 2367.5 359554
405 2012-09-01 00:00:00 2016.0 361922
406 2012-10-01 00:00:00 2343.7 347625
407 2012-11-01 00:00:00 2206.6 320195
Aggregation 聚合语句: 1
2
3
4q = """SELECT strftime('%Y', date) AS year, SUM(beef) AS beef_total
FROM meat
GROUP BY year;"""
print pysqldf(q).head()1
2
3
4
5
6 year beef_total
0 1944 8801
1 1945 9936
2 1946 9010
3 1947 10096
4 1948 8766
注意事项
no such table报错
pandasql
在执行时是读取在内存中的dataframe
名称,因此执行的
SQL
语句一定要放在主程序中,或者将dataframe
设为全局变量。
处理不规范的字段名
当表的名字或列的名字中,含有空格或关键字等一些特殊字符时,我们需要用[]
将表名引起来,告诉语法分析器[]
号内的才是一个完整的名称。比如SELECT * FROM [Order Details]
Pandas 基本操作语句
1 | import pandas as pd |
参考:https://blog.csdn.net/qq_42692386/article/details/113886419