to_sql()
的语法如下:
# https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html
DataFrame.to_sql(name, con, schema=None,
if_exists='fail', index=True, index_label=None,
chunksize=None, dtype=None, method=None)
详细用法,可参见源码,有注释。
从数据库中取出待处理的数据,使用pandas处理过后,再导入数据库。此时取的是movies
这个表的内容。
import pandas as pd
import pymysql
from snownlp import SnowNLP
# 创建数据库连接
from sqlalchemy import create_engine
import sqlalchemy
engine = create_engine('mysql+pymysql://root:pwd123@192.168.10.101:3306/douban?charset=utf8')
#导入数据库内容
df = pd.read_sql('movies',engine)
sqlalchemy中create_engine用法
engine = create_engine('dialect+driver://username:password@host:port/database?charset=utf8')
dialect -- 数据库类型
driver -- 数据库驱动选择
username -- 数据库用户名
password -- 用户密码
host -- 服务器地址
port -- 端口
database -- 数据库
charset -- 连接数据库使用的字符编码
进行数据处理
#增加星级列
star_to_number = {
'力荐' : 5,
'推荐' : 4,
'还行' : 3,
'较差' : 2,
'很差' : 1
}
df['new_star'] = df['star'].map(star_to_number)
# 封装一个情感分析的函数
def _sentiment(text):
s = SnowNLP(text)
return s.sentiments
#对所有内容做情感分析,并增加新列
df["sentiment"] = df.comments.apply(_sentiment) #apply 把前面的输出内容逐条应用到后面括号里面的函数
# 删除不需要的列
del df["star"]
del df["id"]
#调换列的顺序
order = ['new_star', 'comments', 'sentiment']
df = df[order]
# 对索引重命名
df.columns = ['star', 'comments', 'sentiment']
最后把处理过的数据创建一个pandas
新表储存。有两种方式,如果movies
和pandas
的表结构是相同的,那么可以用下面的方式。
#复制movies表结构
with engine.connect() as con:
con.execute('DROP TABLE if exists pandas') #判断pandas表是否存在,如果存在删除。
con.execute('CREATE TABLE pandas LIKE movies') #复制表结构
#写入处理过的内容
df.to_sql('pandas',engine,index=False,if_exists='append') #把数据写入新的数据表。
但是我这里经过数据处理,数据结构字段名称已经不一样了,所以就要新创建一个表,如下:
df.to_sql('pandas', engine, if_exists='replace', index=False,
dtype={'star': sqlalchemy.types.Float(),
'comments': sqlalchemy.types.String(length=2000),
'sentiment': sqlalchemy.types.Float(),
})
常用的SQLAlchemy字段类型
类型名 | python中类型 | 说明 |
---|---|---|
Integer | int | 普通整数,一般是32位 |
SmallInteger | int | 取值范围小的整数,一般是16位 |
BigInteger | int或long | 不限制精度的整数 |
Float | float | 浮点数 |
Numeric | decimal.Decimal | 普通整数,一般是32位 |
String | str | 变长字符串 |
Text | str | 变长字符串,对较长或不限长度的字符串做了优化 |
Unicode | unicode | 变长Unicode字符串 |
UnicodeText | unicode | 变长Unicode字符串,对较长或不限长度的字符串做了优化 |
Boolean | bool | 布尔值 |
Date | datetime.date | 时间 |
Time | datetime.datetime | 日期和时间 |
LargeBinary | str | 二进制文件 |
完整代码:
import pandas as pd
import pymysql
from snownlp import SnowNLP
# 创建数据库连接
from sqlalchemy import create_engine
import sqlalchemy
engine = create_engine('mysql+pymysql://root:pwd123@192.168.10.101:3306/douban?charset=utf8')
#导入数据库内容
df = pd.read_sql('movies',engine)
#增加星级列
star_to_number = {
'力荐' : 5,
'推荐' : 4,
'还行' : 3,
'较差' : 2,
'很差' : 1
}
df['new_star'] = df['star'].map(star_to_number)
# 封装一个情感分析的函数
def _sentiment(text):
s = SnowNLP(text)
return s.sentiments
#对所有内容做情感分析,并增加新列
df["sentiment"] = df.comments.apply(_sentiment) #apply 把前面的输出内容逐条应用到后面括号里面的函数
# 删除不需要的列
del df["star"]
del df["id"]
#调换列的顺序
order = ['new_star', 'comments', 'sentiment']
df = df[order]
# 对索引重命名
df.columns = ['star', 'comments', 'sentiment']
print('- - -' * 10)
##########################################################
#把内容重新存储到数据库
# #复制movies表结构
# with engine.connect() as con:
# con.execute('DROP TABLE if exists pandas')
# con.execute('CREATE TABLE pandas LIKE movies')
#
# #写入处理过的内容
# df.to_sql('pandas',engine,index=False,if_exists='append')
df.to_sql('pandas', engine, if_exists='replace', index=False,
dtype={'star': sqlalchemy.types.Float(),
'comments': sqlalchemy.types.String(length=2000),
'sentiment': sqlalchemy.types.Float(),
})
参考文档:
pandas DataFrame.to_sql() 用法:https://blog.csdn.net/stone0823/article/details/89447982
常用的SQLalchemy 字段类型:https://blog.csdn.net/weixin_41896508/article/details/80772238
Pandas操作数据库新建表&增加现有表数据:https://www.cnblogs.com/qinghuaL/p/11414086.html