pandas: 处理过的数据如何存储到数据库

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新表储存。有两种方式,如果moviespandas 的表结构是相同的,那么可以用下面的方式。

#复制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中类型说明
Integerint普通整数,一般是32
SmallIntegerint取值范围小的整数,一般是16
BigIntegerintlong不限制精度的整数
Floatfloat浮点数
Numericdecimal.Decimal普通整数,一般是32
Stringstr变长字符串
Textstr变长字符串,对较长或不限长度的字符串做了优化
Unicodeunicode变长Unicode字符串
UnicodeTextunicode变长Unicode字符串,对较长或不限长度的字符串做了优化
Booleanbool布尔值
Datedatetime.date时间
Timedatetime.datetime日期和时间
LargeBinarystr二进制文件

完整代码:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值