【问题标题】:Executing SQL on Pandas Dataframe and storing results in same Dataframe在 Pandas Dataframe 上执行 SQL 并将结果存储在同一个 Dataframe 中
【发布时间】:2019-07-03 00:07:54
【问题描述】:

我有一个看起来像上图的数据框。我想要做的是遍历 SQL_SCRIPT 下的 SQL 语句,执行它们,并将结果存储在下一列中,该列将被称为“RESULTS”。当我尝试执行它(不将其存储在任何地方)时,它运行良好,但是当我尝试将结果存储在一个新的数据框列中时,它会出错:

ValueError: cannot set a row with mismatched columns

代码如下:

def run_tests(self):
    s = self.connection()
    df = self.retrieve_sql()
    df_type = df.loc[df['STEP_TYPE'] == 'T']
    df_to_list = df_type[['TABLE_NM', 'TEST_TABLE_NM', 'SQL_SCRIPT']]
    print(df_to_list)
    for sql_script in df_to_list['SQL_SCRIPT']:
        df_to_list.loc['RESULTS'] = pd.read_sql(sql_script,s)
    print(df_to_list)

我也尝试使用会话执行而不是 read_sql,这也可以,但我不确定如何将结果存储到该路径的数据帧中:

def run_tests(self):
    s = self.connection()
    df = self.retrieve_sql()
    df_type = df.loc[df['STEP_TYPE'] == 'T']
    df_to_list = df_type[['TABLE_NM', 'TEST_TABLE_NM', 'SQL_SCRIPT']]
    print(df_to_list)
    for sql_script in df_to_list['SQL_SCRIPT']:
        s.execute(sql_script)

这里是连接函数,如果需要的话:

def connection(self):
    con = self.load_json_file()
    cfg_dsn = con['config']['dsn']
    cfg_usr = con['config']['username']
    cfg_pwd = con['config']['password']

    udaExec = teradata.UdaExec(appName="DataAnalysis", version="1.0", logConsole=False)
    session = udaExec.connect(method="odbc", dsn=cfg_dsn, username=cfg_usr, password=cfg_pwd)

    return session

【问题讨论】:

    标签: python pandas teradata


    【解决方案1】:

    考虑在 SQL 字符串列上运行 Series.apply

    def run_tests(self):
        s = self.connection()
        c = s.cursor()              # OPEN CURSOR
        df = self.retrieve_sql()
    
        df_type = df.loc[df['STEP_TYPE'] == 'T']
        df_to_list = df_type[['TABLE_NM', 'TEST_TABLE_NM', 'SQL_SCRIPT']]
        print(df_to_list)
    
        # NEW METHOD TO RUN QUERY
        def sql_run(x):   
            c.execute(x)
            if c.rowcount > 0:
               res = c.fetchone()[0]
            else:
               res = np.nan
            return res
    
        df_to_list['RESULTS'] = df_to_list['SQL_SCRIPT'].apply(sql_run)
        print(df_to_list)
    

    【讨论】:

    • 谢谢@Parfait。这将返回“NoneType”对象不可下标“。我认为这可能是因为某些 SELECT 查询不是 count(*) 并且它们不返回任何内容(不是 0),这是预期的。有没有办法处理这个?通过在数据框单元格中放置默认值?我不知道。抱歉,我没有在原始问题中包含这个问题,但我认为这可能是问题所在?
    • 在应用函数中添加处理程序。请参阅更新 if 检查游标行数。
    • 谢谢芭菲!那工作得很好。非常非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2015-06-20
    • 2020-12-07
    • 1970-01-01
    相关资源
    最近更新 更多