Ste*_*fan 41 python mysql mysql-python pandas
我可以从python连接到我的本地mysql数据库,我可以创建,选择和插入单个行.
我的问题是:我可以直接指示mysqldb获取整个数据帧并将其插入现有表中,还是我需要遍历行?
在任何一种情况下,对于一个包含ID和两个数据列以及匹配数据帧的非常简单的表,python脚本会是什么样子?
And*_*den 79
现在有一种to_sql
方法,这是执行此操作的首选方法,而不是write_frame
:
df.to_sql(con=con, name='table_name_for_df', if_exists='replace', flavor='mysql')
Run Code Online (Sandbox Code Playgroud)
另请注意:pandas 0.14中的语法可能会改变...
您可以设置与MySQLdb的连接:
from pandas.io import sql
import MySQLdb
con = MySQLdb.connect() # may need to add some other options to connect
Run Code Online (Sandbox Code Playgroud)
设置flavor
的write_frame
,以'mysql'
意味着您可以编写到MySQL:
sql.write_frame(df, con=con, name='table_name_for_df',
if_exists='replace', flavor='mysql')
Run Code Online (Sandbox Code Playgroud)
if_exists
如果表已经存在,该参数告诉pandas如何处理:
if_exists: {'fail', 'replace', 'append'}
,默认'fail'
fail
:如果表存在,则不执行任何操作.
replace
:如果表存在,则删除它,重新创建它并插入数据.
append
:如果表存在,则插入数据.创建如果不存在.
虽然write_frame
文档目前建议它只适用于sqlite,但似乎支持mysql,实际上在代码库中有相当多的mysql测试.
Fra*_*urt 16
安迪海登提到了正确的功能(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)
Run Code Online (Sandbox Code Playgroud)
这使:
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
Run Code Online (Sandbox Code Playgroud)
要将此数据帧导入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')
Run Code Online (Sandbox Code Playgroud)
一个技巧是MySQLdb不能与Python 3.x一起使用.所以我们使用mysqlconnector
,可以安装如下:
pip install mysql-connector==2.1.4 # version avoids Protobuf error
Run Code Online (Sandbox Code Playgroud)
输出:
请注意,to_sql
如果数据库中尚不存在表,则创建表和列.
您可以使用 pymysql 来做到这一点:
例如,假设您有一个包含下一个用户、密码、主机和端口的 MySQL 数据库,并且您想要写入数据库“data_2”(无论它是否已存在)。
import pymysql
user = 'root'
passw = 'my-secret-pw-for-mysql-12ud'
host = '172.17.0.2'
port = 3306
database = 'data_2'
Run Code Online (Sandbox Code Playgroud)
如果您已经创建了数据库:
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')
Run Code Online (Sandbox Code Playgroud)
如果您尚未创建数据库,则当数据库已存在时也有效:
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')
Run Code Online (Sandbox Code Playgroud)
类似主题:
归档时间: |
|
查看次数: |
91930 次 |
最近记录: |