18

かなり大きなパンダかそこらのヘッダーと数十万行のデータがあり、モジュールdataframe - 50を使用してこのデータをデータベースに転送しようとしています。ceODBC以前はpyodbcfor ループで単純な execute ステートメントを使用していましたが、これには途方もなく時間がかかりました (10 分あたり 1000 レコード)...

私は現在、新しいモジュールを試しており、導入しようとしexecutemany()ていますが、次のパラメーターのシーケンスが何を意味するのかよくわかりません。

    cursor.executemany("""insert into table.name(a, b, c, d, e, f) 
values(?, ?, ?, ?, ?), sequence_of_parameters)

次のような各ヘッダーを介して機能する定数リストのように見える必要があります

    ['asdas', '1', '2014-12-01', 'true', 'asdasd', 'asdas', '2', 
'2014-12-02', 'true', 'asfasd', 'asdfs', '3', '2014-12-03', 'false', 'asdasd']
  • これは 3 行の例です

または必要なフォーマットは何ですか?

別の関連する質問として、通常の pandas データフレームをこの形式に変換するにはどうすればよいですか?

ありがとう!

4

4 に答える 4

33

これを試すことができます:

cursor.executemany(sql_str, your_dataframe.values.tolist())

それが役に立てば幸い。

于 2015-05-12T08:37:05.270 に答える
8

私は最終的にこれを理解することができました。したがって、私が使用したモジュールを使用してデータベースに書き込みたい Pandas Dataframe がある場合ceODBC、コードは次のとおりです。

all_dataデータフレームとして)データフレーム値を文字列にマップし、各行をタプルとしてタプルのリストに保存します

for r in all_data.columns.values:
    all_data[r] = all_data[r].map(str)
    all_data[r] = all_data[r].map(str.strip)   
tuples = [tuple(x) for x in all_data.values]

タプルのリストについては、上記の変換で文字列としてキャプチャされたすべての null 値記号を、エンド データベースに渡すことができる null 型に変更します。これは私にとっては問題でしたが、あなたにとってはそうではないかもしれません。

string_list = ['NaT', 'nan', 'NaN', 'None']

def remove_wrong_nulls(x):
    for r in range(len(x)):
        for i,e in enumerate(tuples):
            for j,k in enumerate(e):
                if k == x[r]:
                    temp=list(tuples[i])
                    temp[j]=None
                    tuples[i]=tuple(temp)

remove_wrong_nulls(string_list)

データベースへの接続を作成する

cnxn=ceODBC.connect('DRIVER={SOMEODBCDRIVER};DBCName=XXXXXXXXXXX;UID=XXXXXXX;PWD=XXXXXXX;QUIETMODE=YES;', autocommit=False)
cursor = cnxn.cursor()

タプルのリストを に変換する関数を定義します。new_listこれは、タプルのリストを 1000 個のチャンクにさらにインデックス化したものです。これは、SQL クエリが 1MB を超えてはならないデータベースにデータを渡すために必要でした。

def chunks(l, n):
    n = max(1, n)
    return [l[i:i + n] for i in range(0, len(l), n)]

new_list = chunks(tuples, 1000)

クエリを定義します。

query = """insert into XXXXXXXXXXXX("XXXXXXXXXX", "XXXXXXXXX", "XXXXXXXXXXX") values(?,?,?)"""

new_list1000 のグループのタプルのリストを含む を実行し、を実行しますexecutemany。これに従って、接続をコミットして閉じます。それだけです:)

for i in range(len(new_list)):
    cursor.executemany(query, new_list[i])
cnxn.commit()
cnxn.close()
于 2015-05-13T11:09:04.120 に答える
0

クエリとデータフレームの列の順序が同じになるように少し一般化します。

columns = ','.join(df.columns)
values=','.join([':{:d}'.format(i+1) for i in range(len(df.columns))])

sql = 'INSERT INTO table.name({columns:}) VALUES ({values:})'
cursor.executemany(sql.format(columns=columns, values=values), df.values.tolist())
于 2021-02-19T02:25:05.267 に答える