首页 > 解决方案 > 将来自 SQL 查询的列表结果列表存储在 Pandas 数据框中,其中包含数据框中的相应行

问题描述

我有一些 SQL 查询存储在 Excel 文件中。

原始 SQL 脚本

我想在给定的 SQL 数据库上运行它们,然后将 SQL 查询的结果以及原始数据框存储在单独的数据框中。

from sqlalchemy import create_engine
import pymssql
engine = create_engine('connection string')

首先,我尝试将结果存储在一个工作正常的临时数据框中。这些 SQL 查询中的每一个都提供 3-4 行的输出。

df_result = pd.DataFrame()
for row in df.itertuples(): 
    df_temp = pd.read_sql(row.SQL_Query, engine) 
    df_result = df_result.append(df_temp)

结果数据框

但目标是将结果与其关联的查询/行一起存储。下面显然是错误的,因为循环仅存储最后 3 次的结果

df_result = pd.DataFrame()
for row in df.itertuples(): 
    df_temp = pd.read_sql(row.SQL_Query, engine) 
    df_result = pd.merge(df, df_temp, left_index=True, right_index=True)

不正确的合并结果

标签: sqlpandassqlalchemy

解决方案


考虑构建具有相应ID的数据框列表(假设每一行都是唯一的)。然后concat对于单个输出,最后在IDmerge上使用原始数据框。

df_list = [pd.read_sql(row.SQL_Query, engine).assign(ID=row.ID) for row in df.itertuples()]

sql_df = pd.concat(df_list)

df_result = pd.merge(df, sql_df, on="ID")

推荐阅读