【问题标题】:How to create a tuple of row[colname] from df.iterrows() based off a dictionary如何根据字典从 df.iterrows() 创建 row[colname] 元组
【发布时间】:2021-12-31 01:45:12
【问题描述】:

我正在尝试创建一个基于 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 元组。希望我在这里有意义!谢谢!

【问题讨论】:

  • 看看使用pd.DataFrame.to_sql

标签: python-3.x pandas pypyodbc


【解决方案1】:

也许这适用于您的用例。请参阅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)

【讨论】:

  • 这太完美了,非常感谢!
【解决方案2】:

Series.to_numpyiterrows 之后应该可以做到。

考虑下面的代码:

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))

【讨论】:

    猜你喜欢
    • 2017-04-28
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多