Pandas Dataframe存储到 MySql

Pandas Dataframe 存储到 MySql

存储到MySQL一般方法:
import pymysql
# 建立连接
conn=pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='331303',
    charset='utf8',
)
# 获取光标
cursor=conn.cursor()
# sql语句
sql='insert into new_schema01.sbage (name,age) values (%s,%s)'
data=[('lily',8),('henery',19),('poter',26)]
# data=[('peter','12'),('jack','24'),('mary','34')]
# name = 'wuli'
# age = '24'
try:
    # 执行sql
    cursor.executemany(sql,data)
    # 提交并保存db表
    conn.commit()
except Exception as e:
    print(e)
    #有异常就回滚
    conn.rollback()

# 关闭链接
cursor.close()
conn.close()

这里我存的是MySql,而这次使用非常好使的插入方法:若主键数据相同,则_更新_选中列的数据。一般都是主键相同会更新所有列的数据,其Sql语句格式为:

‘Inser into 表名 (列名1,列名2,…列名n) values (%s,%s,...%s) on duplicate key update 列名1 = values(列名1) 列名2=values(列名2) … 列名n=values(列名n)'

以下函数就是将dataframe存储到MySql的方法,数据会自动增加,参数是“dataframe”和“数据库表名”,里面包含Sql语句的构建过程:

def Store_IpProxy(df,table_name):

    # 使用pandas过程中,数据转化成DataFrame格式会将缺失值会用NAN填充, 如果直接将数据用pymysql写入数据库会报错!
    #
    # 此时需要将NAN替换成None , 因为None插入数据库会被填写Null  也就是数据库中的空值

    # 存储列名
    keys = df.keys()
    values=df.values.tolist()

    key_sql=','.join(keys)
    value_sql=','.join(['%s']*df.shape[1])

    # !important构建Sql语句,若主键数据存在,则_替换_要替换的。
    insert_sql = 'insert into %s (%s) values (%s) on duplicate key update' % (table_name,key_sql,value_sql)
    update_str = ','.join([" {key} = values({key})".format(key=key) for key in keys])
    insert_sql += update_str

    # 创建连接对象
    conn = pymysql.connect(host='localhost', port=3306, user='root', password='331303', charset='utf8', db='netsources')

    # 提交数据库操作
    try:
        conn.cursor().executemany(insert_sql,values)
        conn.commit()
    except Exception as e:
        print(e)
        conn.rollback()
    conn.cursor().close()
    conn.close()

注意:
1.pandas将数据转换为DataFrame时会把缺失值nan填充~
2.如果直接将数据用pymysql写入数据库会报错!此时需要将nan替换成None , 因为None插入数据库会被填写Null 也就是数据库中的空值。

全表替换:df=df.where(df.notnull(),None)
单列替换:df[‘列名1’]=df[‘列名1’].where(df.notnull(),None)

3.pd里datetime64[ns]类型的日期时间列也是存不进MySql的!important
修复办法是:不要使用pd.to_datetime()方法!这方法转换出来的就是datetime[64ns],不是python中的datetime类型。

# df[df.columns[8]] = df[df.columns[8]].str.replace('20-', '2020-')
# df[df.columns[8]] = pd.to_datetime(df[df.columns[8]].str.replace('20-', '2020-'), format='%Y/%m/%d %H:%M')
df[df.columns[8]] = df[df.columns[8]].str.replace('20-', '2020-').apply(lambda x: time.strptime(x,'%Y-%m-%d %H:%M'))

使用.apply方法,用py的time库来转换得出的datetime.datetime格式,在df.dtypes 中显示的是object类型,。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值