我正在嘗試創建一個基于 df 列名稱字典的元組,以便在將資料轉儲到資料庫中時通過我的游標。
想象一個有 3 列的 df:
colA colB colC
1awf pref 02-03-2021
2fef cpvd 02-02-2021
3ace pfva 02-05-2021
4cat raof 01-03-2021
5agt btoa 04-01-2021
以及我創建的一個字典,用于定義 df 中每一列的資料型別:
coldict =
{'colA':'varchar(4)',
'colB':'varchar(4)',
'colC':'date'}
通常,我用來將此資料幀轉儲到資料庫表(此處名為 table_A)的游標陳述句如下所示:
for i,r in df.iterrows():
cursor.execute(
'INSERT INTO table_A(
[colA],[colB],[colC]) VALUES (?,?,?)',
(row['colA'],row['colB'],row['colC']))
現在想象一下,如果該表有 40 列。這是很多打字!我想知道是否有可能在函式中使這個特定的陳述句更加動態,在那里我將傳遞字典并回圈遍歷它以創建 cursor.execute 陳述句的相同 2 部分。INSERT 陳述句非常簡單,我只是遍歷了 coldict 的字典鍵并連接了字串。要通過的問號數量也很容易,因為它只是字典鍵的長度。但是,我正在努力為第二部分做同樣的事情 - 即 (row['colA'],row['colB'],row['colC'])...這可能嗎?最終所需的輸出如下所示:
def datadump(df, insert_statement, rep_qs, df_cols):
for i,r in df.iterrows():
cursor.execute(
insert_statement) VALUES (rep_qs)',
df_cols)
我只需要一種方法來動態創建 df_cols 元組。希望我在這里說得通!謝謝!
uj5u.com熱心網友回復:
也許這適用于您的用例。看看如何簡化插入字串中這么多問號?作為參考
data 是從您定義的字典中獲取的列的元組串列
data = list(map(tuple, df[coldict.keys()].values))
[('1awf', 'pref', '02-03-2021'),
('2fef', 'cpvd', '02-02-2021'),
('3ace', 'pfva', '02-05-2021'),
('4cat', 'raof', '01-03-2021'),
('5agt', 'btoa', '04-01-2021')]
parameters = ", ".join(["?"] * len(coldict.keys()))
query = 'INSERT INTO the_table VALUES(%s);' % parameters
con.executemany(query, data)
uj5u.com熱心網友回復:
在 iterrows之后的Series.to_numpy應該可以做到。
考慮下面的代碼:
import numpy as np
import pandas as pd
coldict = {'colA':'varchar(4)',
'colB':'varchar(4)',
'colC':'date'}
df = pd.DataFrame(data=[['1awf', 'pref', '02-03-2021'],['2fef', 'cpvd', '02-02-2021'],['3ace', 'pfva', '02-05-2021'],['4cat', 'raof', '01-03-2021'],['5agt', 'raof', '01-03-2021']], columns=['colA', 'colB', 'colC'])
def format_ins_stmt(table_name, coldict):
k = list(coldict.keys())
colliststr = ""
rep_qs = ""
for col in k:
colliststr = colliststr "[" col "],"
rep_qs = rep_qs "?,"
return "INSERT INTO " table_name "(" colliststr[:-1] ") VALUES (" rep_qs[:-1] ")"
def datadump(df, insert_statement):
for i,r in df.iterrows():
lst = r.to_numpy()
# cursor.execute(
# insert_statement,
# lst)
datadump(df, format_ins_stmt('tabA', coldict))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/399114.html
上一篇:讀入.txt檔案,轉換為Pandas資料幀,但空格分隔值因空格數而異
下一篇:在熊貓中繪制資料和圖形文本
