【问题标题】:Store a list of list result from a SQL query in a Pandas dataframe with the appropriate row from the data frame将来自 SQL 查询的列表结果列表存储在 Pandas 数据框中,其中包含数据框中的相应行
【发布时间】:2019-05-07 21:07:12
【问题描述】:

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

我想在给定的 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)

【问题讨论】:

标签: sql pandas sqlalchemy


【解决方案1】:

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

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

【讨论】:

  • 我理解第 1 行的代码,但你能解释一下它背后的一些想法吗?可能有用。比如你为什么要创建一个列表?另外,在末尾编写的 for 循环与在开头编写的循环不同吗?
  • 抱歉之前没有看评论。是的,效果很好。
  • 第一行是 list comprehension 构建数据帧列表,这是比二次复制更受欢迎的方式。注意concat 只在任何循环之外运行一次。
猜你喜欢
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 2018-11-09
相关资源
最近更新 更多