将熊猫Dataframe或numpy数组导出到MySQL

问题描述:

我正在使用python将大型矩阵(3000 * 3000左右的形状)导出到MySQL中。将熊猫Dataframe或numpy数组导出到MySQL

现在我正在使用MySQLdb插入这些值,但它太麻烦,效率太低。这是我的代码:

# -*- coding:utf-8 -*- 


import MySQLdb 
import numpy as np 
import pandas as pd 
import time 


def feature_to_sql_format(df): 
    df = df.fillna(value='') 
    columns = list(df.columns) 
    index = list(df.index) 
    index_sort = np.reshape([[int(i)] * len(columns) for i in index], (-1)).tolist() 
    columns_sort = (columns * len(index)) 
    values_sort = df.values.reshape(-1).tolist() 
    return str(zip(index_sort, columns_sort, values_sort))[1: -1].replace("'NULL'", 'NULL') 


if __name__ == '__main__': 
    t1 = time.clock() 
    df = pd.read_csv('C:\\test.csv', header=0, index_col=0) 
    output_string = feature_to_sql_format(df) 
    sql_CreateTable = 'USE derivative_pool;DROP TABLE IF exists test1;' \ 
         'CREATE TABLE test1(date INT NOT NULL, code VARCHAR(12) NOT NULL, value FLOAT NULL);' 
    sql_Insert = 'INSERT INTO test (date,code,value) VALUES ' + output_string + ';' 
    con = MySQLdb.connect(......) 
    cur = con.cursor() 
    cur.execute(sql_CreateTable) 
    cur.close() 
    cur = con.cursor() 
    cur.execute(sql_Insert) 
    cur.close() 
    con.commit() 
    con.close() 
    t2 = time.clock() 
    print t2 - t1 

而且它总共消耗大约274秒。

我想知道是否有一个简单的方法来做到这一点,我想将矩阵导出到csv,然后使用LOAD DATA INFILE导入,但它也太复杂了。

我注意到,在大熊猫文档大熊猫据帧具有功能to_sql,并在version 0.14您可以在“味道”设置为“MySQL的,那就是:

df.to_sql(con=con, name=name, flavor='mysql') 

但现在我的大熊猫版本是0.19.2和味道减少到只有'sqlite'......并且我仍然试图使用

df.to_sql(con=con, name=name, flavor='sqlite') 

它给我一个错误。

有没有简单的方法可以做到这一点?

+0

的[使用SQLAlchemy的,到\ _SQL写入MySQL数据库与熊猫]可能的复制(http://*.com/questions/30631325/write-to-mysql-database-with-pandas-using-sqlalchemy-to-sql) – languitar

后来大熊猫版本支持SQLAlchemy的连接器,而不是flavor = "mysql"

首先,安装依赖:

pip install mysql-connector-python-rf==2.2.2 
pip install MySQL-python==1.2.5 
pip install SQLAlchemy==1.1.1 

然后创建引擎:

from sqlalchemy import create_engine 
connection_string= "mysql+mysqlconnector://root:@localhost/MyDatabase" 
engine = create_engine(connection_string) 

然后你可以使用df.to_sql(...)

df.to_sql('MyTable', engine) 

这里有一些事情你可以做MYSQL,以加快数据加载:

SET FOREIGN_KEY_CHECKS = 0; 
SET UNIQUE_CHECKS = 0; 
SET SESSION tx_isolation='READ-UNCOMMITTED'; 
SET sql_log_bin = 0; 
#LOAD DATA LOCAL INFILE.... 
SET UNIQUE_CHECKS = 1; 
SET FOREIGN_KEY_CHECKS = 1; 
SET SESSION tx_isolation='READ-REPEATABLE'; 
+0

感谢它的运作,但问题是我试过了,它需要更长的时间! 有没有办法缩短这个过程?我的csv大约是3000 * 3000,它只需要100M作为csv格式文件。我不明白为什么需要这么长时间... –

+0

@DirkPaul您的CSV有3000行和3000列? – Sam

+0

是的,但它对于SQL来说太大了,所以我必须把它变成一维(row_number,column_number,value) –