下面我将详细讲解“Python+Pandas获取数据库并加入DataFrame的实例”的完整攻略。
简介
Pandas是一个Python数据分析包,可以用来处理和分析数据。通过它可以实现数据的清洗、对齐、统计、可视化等操作,并且可以非常方便地与数据库进行交互。
在Python中,要将数据库中的数据导入Pandas中,需要用到以下三个模块:
- sqlalchemy:一个Python开发的ORM(对象关系映射)框架,用于将Python对象映射到数据库中的数据表,可以支持多种不同类型的数据库。
- pandas:一个Python开发的数据分析包,在Pandas中可以使用read_sql()方法读取数据库中的数据。
- pymysql:Python连接MySQL数据库的模块。
下面分别介绍这三个模块的使用。
安装模块
首先需要使用pip安装相关模块,可以使用以下命令进行安装:
pip install sqlalchemy
pip install pandas
pip install pymysql
连接数据库
在Python中,连接MySQL数据库需要使用pymysql模块。假设数据库的配置信息如下:
host: localhost
port: 3306
database: test
username: root
password: 123456
下面是连接数据库的代码:
import pymysql
from sqlalchemy import create_engine
# 配置MySQL数据库连接信息
db_info = {
'user': 'root',
'password': '123456',
'host': 'localhost',
'port': 3306,
'database': 'test'
}
# 创建MySQL数据库连接
engine = create_engine('mysql+pymysql://%s:%s@%s:%s/%s?charset=utf8mb4' % (
db_info['user'], db_info['password'], db_info['host'], db_info['port'], db_info['database']))
conn = engine.connect()
这里使用create_engine()方法创建MySQL数据库连接,其中的配置信息就是上面提到的数据库连接信息。连接成功之后,可以调用execute()方法执行SQL语句。
读取数据
连接成功之后,就可以使用Pandas的read_sql()方法读取数据库中的数据了。read_sql()方法需要两个参数:SQL语句和数据库连接对象,如下面的示例:
import pandas as pd
# 读取数据
sql = "select * from user"
df = pd.read_sql(sql, conn)
print(df)
这里的SQL语句是“select * from user”,用于查询user表中的所有数据。read_sql()方法将查询到的数据读取到DataFrame中,然后可以对数据进行处理或分析。
另外,如果查询结果字段较多,可以使用SELECT指定需要的字段,避免不必要的数据传输和处理:
import pandas as pd
# 读取数据
sql = "select id, name, age from user"
df = pd.read_sql(sql, conn)
print(df)
这里的SQL语句是“select id, name, age from user”,只查询id、name和age三个字段的数据。
将数据写入数据库
当数据需要写入数据库时,Pandas提供了to_sql()方法方便地将DataFrame中的数据插入到数据库中。该方法需要三个参数:表名、数据库连接对象和if_exists参数。
下面是一个将数据写入数据库的示例:
import pandas as pd
# 创建DataFrame对象
data = [
{'id': 1, 'name': 'Tom', 'age': 23},
{'id': 2, 'name': 'Jack', 'age': 25},
{'id': 3, 'name': 'Mary', 'age': 28},
]
df = pd.DataFrame(data)
# 将数据写入数据库
table_name = 'user'
df.to_sql(table_name, conn, if_exists='append', index=False)
这里的DataFrame对象中包含了三行数据,然后使用to_sql()方法将数据写入到名为“user”的表中。
其中,if_exists参数可以指定如果表已经存在时的处理方式。如果设置为“fail”,则会直接报错;如果设置为“replace”,则会删除原有表数据,重新插入新数据;如果设置为“append”,则会将新数据添加到表中。
示例说明
下面是一个完整的示例,演示如何将城市信息从数据库中读取到DataFrame中,并通过计算获得人口密度,最后将数据重新写入到数据库中。城市信息存储在名为“city”的表中,包含城市名称、面积和人口三个字段。注:此示例使用MySQL数据库。
import pandas as pd
from sqlalchemy import create_engine
# 配置MySQL数据库连接信息
db_info = {
'user': 'root',
'password': '123456',
'host': 'localhost',
'port': 3306,
'database': 'test'
}
# 创建MySQL数据库连接
engine = create_engine('mysql+pymysql://%s:%s@%s:%s/%s?charset=utf8mb4' % (
db_info['user'], db_info['password'], db_info['host'], db_info['port'], db_info['database']))
conn = engine.connect()
# 读取城市信息
sql = "select * from city"
df = pd.read_sql(sql, conn)
# 计算人口密度
df['density'] = df['population'] / df['area']
# 将数据写入数据库
table_name = 'city_population_density'
df.to_sql(table_name, conn, if_exists='replace', index=False)
print('城市人口密度信息已写入数据库')
在上面的代码中,先读取城市信息到DataFrame中,然后计算人口密度(density)字段。最后使用to_sql()方法将数据重新写入数据库中,这里的if_exists参数设置为“replace”,表示先删除原有数据,再插入新的数据。执行完毕后,输出提示信息“城市人口密度信息已写入数据库”。