pandasql允许用标准SQL语法(如SELECT、JOIN、GROUP BY)直接查询pandas DataFrame,其原理是将DataFrame注册为SQLite内存表,通过sqldf()函数执行SQL并返回新DataFrame,需显式传入globals()或locals()定位表名。

不能直接用 SQL 查询语句“执行”在 Pandas DataFrame 上——pandas 本身不解析或运行 SQL;但你可以用 pandasql 这个第三方库,它把 DataFrame 当作“内存数据库表”,用 SQLite 引擎帮你执行 SQL 查询。
为什么不用原生 pandas 就要装 pandasql
pandas 的 query()、loc[] 等方法本质是 Python 表达式求值,不是 SQL 解析器。你写 SELECT name FROM df WHERE age > 30,原生 pandas 会报 NameError 或 SyntaxError,因为它根本不认识 SELECT 关键字。
-
pandasql底层调用sqlite3,把 DataFrame 自动注册为临时表(表名就是你传进去的变量名) - 所有标准 SQLite 语法都支持:
JOIN、子查询、GROUP BY、ORDER BY,甚至窗口函数(SQLite 3.25+) - 不修改原始 DataFrame,返回新 DataFrame,符合函数式习惯
安装与基础用法:sqldf() 函数怎么调
先装库:pip install pandasql。核心函数是 sqldf(),第一个参数是 SQL 字符串,第二个是 locals() 或 globals() 字典,用来查找表名对应的 DataFrame。
from pandasql import sqldf
import pandas as pd
<p>df = pd.DataFrame({'name': ['Alice', 'Bob'], 'age': [25, 30]})
result = sqldf("SELECT * FROM df WHERE age > 28", globals())- 必须显式传入
globals()或locals(),否则报错no such table: df - 表名就是你在 Python 中定义的变量名(如
df),不是字符串"df",SQL 里直接写FROM df - 别名在 SQL 里生效,比如
SELECT name AS full_name FROM df,但不会影响原 DataFrame
常见报错和绕过技巧
遇到 OperationalError: no such column 或 near "AS": syntax error?多半是列名含空格、连字符或 Python 关键字。
立即学习“Python免费学习笔记(深入)”;
- 列名有空格:用方括号括起来,如
SELECT [user id] FROM df - 列名是关键字(如
order,group):同样加方括号,SELECT [order] FROM df - 想查中文列名:支持,但必须用方括号,
SELECT [姓名] FROM df -
JOIN时两张表字段重名:必须用表别名限定,SELECT a.name, b.score FROM df1 a JOIN df2 b ON a.id = b.id
性能和边界要注意什么
pandasql 适合中等规模数据(几万行以内)。它把 DataFrame 全量转成 SQLite 内存表,再执行查询——这意味着:
- 每次调用
sqldf()都触发一次全量导入,频繁调用很慢;批量查询建议拼成一条 SQL - 不支持 Pandas 特有类型:
datetime64[ns]会被转成字符串,category类型丢失,数值精度可能降为 float64 - 无法使用 Pandas 的向量化函数(如
str.contains()),但 SQLite 的LIKE、INSTR()可替代
如果只是简单过滤,用 df.query("age > 30") 更快更轻量;真需要 SQL 逻辑(尤其是多表关联或聚合嵌套),pandasql 是目前最稳的方案。


















