1. pandas.read_sql()概述
在Python Pandas中,pandas.read_sql()函数可以用来读取SQL数据库当中的数据,并将其转换成Pandas中的DataFrame格式。这个函数包含了许多参数,可以帮助你实现各种不同的读取数据的需求。下面将通过一个实例来介绍它的用法。
2. 实例介绍
为了演示pandas.read_sql()的用法,我们需要先准备好一个SQL数据库。在这个例子中,我们使用了一个开源的电影数据集,其中包含了电影的基本信息以及评分数据。这个数据集可以从以下链接中下载到:
https://grouplens.org/datasets/movielens/
下载完成之后,我们先将数据集导入到一个名为“movielens”的数据库中。在命令行中输入以下命令来进行导入:
mysql -u root -p
CREATE DATABASE movielens;
USE movielens;
source /path/to/movielens.sql;
注意:你需要将“/path/to/”替换为你的SQL文件的路径。
下面的实例代码中,我们将使用pandas.read_sql()函数来读取movielens数据库中的数据,并将其保存到一个DataFrame中。
2.1 读取整张表中的数据
如果你想要读取整张表中的数据,可以使用以下代码:
import pandas as pd
import pymysql
# 创建连接
conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='123456', db='movielens', charset='utf8')
# 创建游标
cur = conn.cursor()
# 读取数据
cur.execute("SELECT * FROM ratings")
result = cur.fetchall()
# 将数据保存到DataFrame中
df = pd.DataFrame(list(result), columns=['userID', 'movieID', 'rating', 'timestamp'])
# 关闭游标和连接
cur.close()
conn.close()
print(df.head())
在这段代码中,我们首先使用pymysql模块来创建一个MySQL连接对象conn,然后使用该对象来创建一个游标对象cur,用于执行SQL语句。接着,我们使用cur.execute()函数执行SQL查询语句,并使用fetchall()函数获取查询结果。最后,我们将查询结果转换成一个DataFrame对象,并将每个字段的名称指定为“userID”、“movieID”、“rating”和“timestamp”。
运行该代码,你将看到如下输出结果:
userID movieID rating timestamp
0 1 1 4.0 964982703
1 1 3 4.0 964981247
2 1 6 4.0 964982224
3 1 47 5.0 964983815
4 1 50 5.0 964982931
从输出结果可以看出,数据已经成功读取到DataFrame中。
2.2 读取部分数据
如果你想要读取部分数据,可以在SQL查询语句中添加条件语句。例如,如果你只想要读取评分数据中userID为1的记录,可以使用以下代码:
import pandas as pd
import pymysql
# 创建连接
conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='123456', db='movielens', charset='utf8')
# 创建游标
cur = conn.cursor()
# 读取数据
cur.execute("SELECT * FROM ratings WHERE userID=1")
result = cur.fetchall()
# 将数据保存到DataFrame中
df = pd.DataFrame(list(result), columns=['userID', 'movieID', 'rating', 'timestamp'])
# 关闭游标和连接
cur.close()
conn.close()
print(df.head())
运行该代码,你将看到如下输出结果:
userID movieID rating timestamp
0 1 1 4.0 964982703
1 1 3 4.0 964981247
2 1 6 4.0 964982224
3 1 47 5.0 964983815
4 1 50 5.0 964982931
从输出结果可以看出,只有userID为1的记录被读取到了DataFrame中。
2.3 读取指定字段
如果你只想要读取表中的部分字段,可以在SQL查询语句中指定所需的字段名称。例如,如果你只想要读取评分数据中的userID和rating字段,可以使用以下代码:
import pandas as pd
import pymysql
# 创建连接
conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='123456', db='movielens', charset='utf8')
# 创建游标
cur = conn.cursor()
# 读取数据
cur.execute("SELECT userID, rating FROM ratings")
result = cur.fetchall()
# 将数据保存到DataFrame中
df = pd.DataFrame(list(result), columns=['userID', 'rating'])
# 关闭游标和连接
cur.close()
conn.close()
print(df.head())
运行该代码,你将看到如下输出结果:
userID rating
0 1 4.0
1 1 4.0
2 1 4.0
3 1 5.0
4 1 5.0
从输出结果可以看出,只有userID和rating两个字段被读取到了DataFrame中。
2.4 使用参数
pandas.read_sql()函数还包含了许多参数,可以帮助你实现各种不同的读取数据的需求。下面我们将介绍其中一些常用的参数。
2.4.1 使用params参数
params参数可以帮助你在SQL查询语句中使用占位符,以避免SQL注入攻击。以下是一个例子:
import pandas as pd
import pymysql
# 创建连接
conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='123456', db='movielens', charset='utf8')
# 创建游标
cur = conn.cursor()
# 读取数据
cur.execute("SELECT * FROM ratings WHERE userID=%s", (1,))
result = cur.fetchall()
# 将数据保存到DataFrame中
df = pd.DataFrame(list(result), columns=['userID', 'movieID', 'rating', 'timestamp'])
# 关闭游标和连接
cur.close()
conn.close()
print(df.head())
在这段代码中,我们使用占位符“%s”来代替SQL语句中的参数,然后将参数值传递给params参数。这样就能够防止SQL注入攻击。
2.4.2 使用chunksize参数
chunksize参数可以帮助你将大量数据分成小块进行读取。这可以有效减少内存的使用,并且可以避免程序崩溃。以下是一个例子:
import pandas as pd
import pymysql
# 创建连接
conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='123456', db='movielens', charset='utf8')
# 创建游标
cur = conn.cursor()
# 读取数据
for df in pd.read_sql("SELECT * FROM ratings", con=conn, chunksize=10000):
print(df.head())
# 关闭游标和连接
cur.close()
conn.close()
在这段代码中,我们将chunksize参数设置为10000,表示每次读取10000条数据。然后使用for循环遍历每一个DataFrame,依次处理每一块数据。
3. 总结
pandas.read_sql()函数是一个常用的函数,可以帮助你读取SQL数据库中的数据,并将其转换为Pandas中的DataFrame格式。通过本文介绍的实例,你可以学会如何使用该函数来读取整张表中的数据、读取部分数据、读取指定字段以及使用参数等操作。