Featured image of post 【Python Pandas】CSVファイルからpymysqlでInsert

【Python Pandas】CSVファイルからpymysqlでInsert

データ分析ライブラリPandasを使って、CSVからMySQLにInsertします。一度にまとめてInsertしたり、CSV項目に列を追加してテーブルにInsertする方法がなかなか分からなくて苦労しましたがなんとか解決したのでここに残しておきます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
csv_path = './data/dbinsert/player/'
for csvfile in os.listdir(csv_path):
    filename = os.path.splitext(csvfile)[0]
    df = pd.read_csv(csv_path + csvfile,encoding='shift-jis"', dtype=object )

    df.insert(0, 'ファイル名', filename)
    df['登番'] = df['登番'].fillna(0).astype(int)
    df['性別'] = df['性別'].fillna(0).astype(int)
    df['年齢'] = df['年齢'].fillna(0).astype(int)
    df['身長'] = df['身長'].fillna(0).astype(int)
    df['体重'] = df['体重'].fillna(0).astype(int)
    df['勝率'] = df['勝率'].apply(floatchg)
    df['複勝率'] = df['複勝率'].apply(floatchg)
    df['1着回数'] = df['1着回数'].fillna(0).astype(int)
    df['2着回数'] = df['2着回数'].fillna(0).astype(int)
    df['出走回数'] = df['出走回数'].fillna(0).astype(int)
    df['優出回数'] = df['優出回数'].fillna(0).astype(int)
    df['優勝回数'] = df['優勝回数'].fillna(0).astype(int)
    df['平均スタートタイミング'] = df['平均スタートタイミング'].apply(floatchg)

    with self.connection.cursor() as cursor:
        sql="DELETE FROM `player` WHERE `ファイル名`= '"  +  filename + "'"
        cursor.execute(sql)

        sql  = "INSERT INTO `player` "
        sql += " VALUES (%s, %s, %s, %s, %s, %s, %s, "
        sql += "         %s, %s, %s, %s, %s, %s, %s, "
        sql += "         %s, %s, %s, %s, %s, %s) "
        cursor.executemany(sql,df.values.tolist())

self.connection.commit()
self.connection.close()

時間がかかった点は2点です。 ↓で読み込んだDataFrame

1
df = pd.read_csv(csv_path + csvfile,encoding='shift-jis"', dtype=object )

 

に列追加する方法が分からなくて困りました。以下です。

1
df.insert(0, 'ファイル名', filename)

 

そして、テーブルカラム数が多かったのでDataFrameで一度にInsertする方法も分からなくて困りました。以下です。

1
cursor.executemany(sql,df.values.tolist())
Licensed under CC BY-NC-SA 4.0
Hugo で構築されています。
テーマ StackJimmy によって設計されています。