如何通过MySQLdb的插入大熊猫据帧到数据库?(How to insert pandas data

2019-09-02 11:01发布

我可以从蟒蛇连接到我的本地mysql数据库,我可以创造,从选择,并插入单个行。

我的问题是:我可以直接指示MySQLdb的来使整个数据帧并将其插入到现有的表,或者我需要遍历行?

在这两种情况下,将在python脚本的样子与ID和两个数据列,和匹配数据帧一个非常简单的表呢?

Answer 1:

更新:

现在有一个to_sql方法,这是要做到这一点,而不是首选方式write_frame

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

另外请注意:语法可能大熊猫0.14更改...

您可以设置与连接MySQLdb的 :

from pandas.io import sql
import MySQLdb

con = MySQLdb.connect()  # may need to add some other options to connect

设置flavorwrite_frame'mysql'意味着你可以编写到MySQL:

sql.write_frame(df, con=con, name='table_name_for_df', 
                if_exists='replace', flavor='mysql')

该参数if_exists告诉大熊猫如何处理,如果该表已经存在:

if_exists: {'fail', 'replace', 'append'}默认的'fail'
fail :如果表存在,什么也不做。
replace :如果表存在,删除它,重新创建它,并插入数据。
append :如果表存在,插入数据。 创建如果它不存在。

虽然write_frame文档目前认为它只能在sqlite的,MySQL的似乎是支持的,实际上有相当多的在MySQL的代码库测试 。



Answer 2:

安迪·海登提到正确的函数( to_sql )。 在这个答案,我会给出一个完整的例子,这是我与Python 3.5测试,但也应该适用于Python 2.7版(和Python 3.X):

首先,让我们创建数据框:

# Create dataframe
import pandas as pd
import numpy as np

np.random.seed(0)
number_of_samples = 10
frame = pd.DataFrame({
    'feature1': np.random.random(number_of_samples),
    'feature2': np.random.random(number_of_samples),
    'class':    np.random.binomial(2, 0.1, size=number_of_samples),
    },columns=['feature1','feature2','class'])

print(frame)

这使:

   feature1  feature2  class
0  0.548814  0.791725      1
1  0.715189  0.528895      0
2  0.602763  0.568045      0
3  0.544883  0.925597      0
4  0.423655  0.071036      0
5  0.645894  0.087129      0
6  0.437587  0.020218      0
7  0.891773  0.832620      1
8  0.963663  0.778157      0
9  0.383442  0.870012      0

要导入该数据帧到MySQL表:

# Import dataframe into MySQL
import sqlalchemy
database_username = 'ENTER USERNAME'
database_password = 'ENTER USERNAME PASSWORD'
database_ip       = 'ENTER DATABASE IP'
database_name     = 'ENTER DATABASE NAME'
database_connection = sqlalchemy.create_engine('mysql+mysqlconnector://{0}:{1}@{2}/{3}'.
                                               format(database_username, database_password, 
                                                      database_ip, database_name))
frame.to_sql(con=database_connection, name='table_name_for_df', if_exists='replace')

一个窍门是MySQLdb的不使用Python 3.x的工作 所以不是我们使用mysqlconnector ,可以安装如下:

pip install mysql-connector==2.1.4  # version avoids Protobuf error

输出:

需要注意的是to_sql创建表以及列,如果他们不已经存在于数据库中。



Answer 3:

您可以通过使用pymysql做到这一点:

例如,假设你有下一个用户名,密码,主机和端口的MySQL数据库,并要在数据库“_2”来写, 如果它已经存在与否

import pymysql
user = 'root'
passw = 'my-secret-pw-for-mysql-12ud'
host =  '172.17.0.2'
port = 3306
database = 'data_2'

如果你已经有了数据库中创建的

conn = pymysql.connect(host=host,
                       port=port,
                       user=user, 
                       passwd=passw,  
                       db=database,
                       charset='utf8')

data.to_sql(name=database, con=conn, if_exists = 'replace', index=False, flavor = 'mysql')

如果你没有数据库中创建的 ,也是有效的,当数据库已经存在:

conn = pymysql.connect(host=host, port=port, user=user, passwd=passw)

conn.cursor().execute("CREATE DATABASE IF NOT EXISTS {0} ".format(database))
conn = pymysql.connect(host=host,
                       port=port,
                       user=user, 
                       passwd=passw,  
                       db=database,
                       charset='utf8')

data.to_sql(name=database, con=conn, if_exists = 'replace', index=False, flavor = 'mysql')

类似的线程:

  1. 使用SQLAlchemy的写入MySQL数据库与大熊猫,to_sql
  2. 编写熊猫数据帧到MySQL


Answer 4:

你可能输出的DataFrame为CSV文件,然后使用mysqlimport导入您的CSV到您mysql

编辑

好像大熊猫的建设的SQL UTIL提供write_frame功能,但只有在sqlite的工作。

我发现一些有用的东西,你可以试试这个



Answer 5:

该to_sql方法为我工作。

但是,请记住,它看起来像它会赞成的SQLAlchemy的被弃用:

FutureWarning: The 'mysql' flavor with DBAPI connection is deprecated and will be removed in future versions. MySQL will be further supported with SQLAlchemy connectables. chunksize=chunksize, dtype=dtype)


Answer 6:

蟒2 + 3

Prerequesites

  • 熊猫
  • MySQL服务器
  • SQLAlchemy的
  • pymysql :纯Python MySQL客户端

from pandas.io import sql
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://{user}:{pw}@localhost/{db}"
                       .format(user="root",
                               pw="your_password",
                               db="pandas"))
df.to_sql(con=engine, name='table_name', if_exists='replace')


文章来源: How to insert pandas dataframe via mysqldb into database?