Выполнение SQL на Pandas Dataframe и сохранение результатов в одном Dataframe - PullRequest
0 голосов
/ 08 февраля 2019

current dataframe

У меня есть фрейм данных, похожий на изображение выше.То, что я хочу сделать, это перебрать операторы SQL в SQL_SCRIPT, выполнить их и сохранить результаты в следующем столбце, который будет называться «РЕЗУЛЬТАТЫ».Когда я просто пытаюсь выполнить его (нигде не сохраняя), он работает нормально, но когда я пытаюсь сохранить результаты в новом столбце данных, он выдает ошибку:

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 я также попытался просто использовать сеанс execute, который также работает, но я не уверен, как сохранить результаты в кадре данных, идущем по этому маршруту:

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 Ответ

0 голосов
/ 08 февраля 2019

Попробуйте запустить 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)
...