如何基于字典从 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)