如何基于字典从 df.iterrows() 创建一个 row[colname] 的元组
How to create a tuple of row[colname] from df.iterrows() based off a dictionary
我正在尝试创建一个基于 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(此处命名为 table_A)的游标语句如下所示:
for i,r in df.iterrows():
cursor.execute(
'INSERT INTO table_A(
[colA],[colB],[colC]) VALUES (?,?,?)',
(row['colA'],row['colB'],row['colC']))
现在想象一下,如果 table 有 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 的元组。希望我在这里说得通!谢谢!
Series.to_numpy经过iterrows应该就可以了
考虑以下代码:
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))
也许这适用于您的用例。参见 how to simplify the so many question mark in the insert string ? 作为参考
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)
我正在尝试创建一个基于 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(此处命名为 table_A)的游标语句如下所示:
for i,r in df.iterrows():
cursor.execute(
'INSERT INTO table_A(
[colA],[colB],[colC]) VALUES (?,?,?)',
(row['colA'],row['colB'],row['colC']))
现在想象一下,如果 table 有 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 的元组。希望我在这里说得通!谢谢!
Series.to_numpy经过iterrows应该就可以了
考虑以下代码:
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))
也许这适用于您的用例。参见 how to simplify the so many question mark in the insert string ? 作为参考
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)