我可以从python连接到我的本地mysql数据库,还可以创建、选择和插入单独的行。
我的问题是:我是否可以直接指示mysqldb获取整个数据帧并将其插入到现有的表中,或者我是否需要迭代行?
在这两种情况下,对于一个包含ID、两个数据列和一个匹配数据帧的非常简单的表,python脚本会是什么样子呢?
发布于 2018-01-23 10:10:16
Andy Hayden提到了正确的函数(to_sql
)。在这个答案中,我将给出一个完整的例子,我用Python3.5测试过,但也应该适用于Python2.7(和Python3.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不能与Python3.x一起工作。因此,我们改用mysqlconnector
,它可能是如下所示的installed:
pip install mysql-connector==2.1.4 # version avoids Protobuf error
输出:
请注意,如果数据库中不存在表和列,则to_sql
会创建表和列。
发布于 2016-10-09 23:55:03
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)
发布于 2013-05-10 14:56:52
您可以将DataFrame
输出为csv文件,然后使用mysqlimport
将csv导入到mysql
中。
编辑
pandas's build-in sql util似乎提供了一个write_frame
函数,但只在sqlite中起作用。
我发现了一些有用的东西,你可以试试this
https://stackoverflow.com/questions/16476413
复制相似问题