web-dev-qa-db-ja.com

mysqldbを介してpandas dataframeをデータベースに挿入するには?

Pythonからローカルmysqlデータベースに接続でき、個々の行を作成、選択、挿入できます。

私の質問は、データフレーム全体を取得して既存のテーブルに挿入するようにmysqldbに直接指示できますか、または行を反復処理する必要がありますか?

どちらの場合でも、IDと2つのデータ列、および一致するデータフレームを持つ非常に単純なテーブルの場合、pythonスクリプトはどのようになりますか?

39
Stefan

更新:

現在、 to_sql メソッドがあります。これは、write_frameではなく、これを行うための好ましい方法です。

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

また、構文はpandas 0.14 ...

MySQLdb を使用して接続をセットアップできます。

from pandas.io import sql
import MySQLdb

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

write_frameflavor'mysql'に設定すると、mysqlに書き込むことができます。

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

引数if_existsは、pandasテーブルが既に存在する場合の対処方法:

if_exists: {'fail', 'replace', 'append'}、デフォルト'fail'
fail:テーブルが存在する場合、何もしません。
replace:テーブルが存在する場合は、ドロップしてから再作成し、データを挿入します。
append:テーブルが存在する場合、データを挿入します。存在しない場合は作成します。

write_frame docs は現在sqliteでのみ動作することを示唆していますが、mysqlはサポートされているようで、実際にはかなり多くの がありますコードベースでのmysqlテスト

78
Andy Hayden

アンディ・ヘイデンは正しい関数に言及した( 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')

1つのトリックは、 MySQLdb がPython 3.xで動作しないため、代わりにmysqlconnectorは、次のように installed になります。

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

出力:

enter image description here

to_sql は、テーブルと列がデータベースにまだ存在しない場合、それらを作成します。

13

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'

データベースがすでに作成されている場合

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. pandas using SQLAlchemy、to_sql を使用してMySQLデータベースに書き込む
  2. Pandas Dataframe to MySQL の作成)==
3
Rafael Valero

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)
1
Alex_L

Python 2 + 3

前提条件

  • Pandas
  • MySQLサーバー
  • sqlalchemy
  • pymysql :pure python mysql client

コード

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')
1
Martin Thoma

DataFrameをcsvファイルとして出力し、mysqlimportを使用してcsvをmysqlにインポートします。

編集

pandasのビルトインsql utilwrite_frame関数ですが、sqliteでのみ機能します。

私は何か有用なものを見つけました、あなたは this を試すかもしれません

1
waitingkuo