代码之家  ›  专栏  ›  技术社区  ›  JD2775

在Dataframe上执行SQL并将结果存储在同一Dataframe中

  •  1
  • JD2775  · 技术社区  · 7 年前

    current dataframe

    我有一个数据框,看起来像上面的图片。我想做的是在SQL_脚本下循环SQL语句,执行它们,并将结果存储在下一列中,在下一列中称为“results”。当我尝试执行它时(不将其存储在任何地方),它运行良好,但当我尝试将结果存储在新的dataframe列中时,它会出错:

    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
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Parfait    7 年前

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

    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)