从 pd.read_sql 输出附加到 Pandas Dataframe

Appending to a Pandas Dataframe From a pd.read_sql Output

我来自 R,但由于各种原因需要在 Python 中执行此操作。 这很可能是我的 Python 的基本 PEBKAC 问题,比 Pandas、PyODBC 或其他任何问题都多。

请多多包涵

我目前的Python3码:

import pandas as pd
import pyodbc 
cnxn = pyodbc.connect(DSN="databasename", uid = "username", pwd = "password")

querystring = 'select order_number, creation_date from table_name where order_number = ?'

orders = ['1234',
'2345',
'3456',
'5678']

for i in orders:
   print(pd.read_sql(querystring, cnxn, params = [i]))

我需要的是一个列名为 "order_number" 和 "creation_date."

的数据框

代码输出的是:

抱歉截屏,无法在此处正确设置格式。

阅读 dataframe.append page 后,我尝试了这个:

df = pd.DataFrame()

for i in orders:
       df.append(pd.read_sql(querystring, cnxn, params = [i]))

这似乎 运行 很好(无论如何都没有抛出错误)。

但是当我尝试输出 df 时,我得到

Empty DataFrame
Columns: []
Index: []

所以肯定可以使用列表(或元组、字典、ymmv)中的参数执行 pd.read_sql,并将这些结果作为行添加到 pd.DataFrame() 中。

但是,我的 Stack 搜索、谷歌搜索或 Python 总体上都失败了(这三者都有明显的可能性)。

如有任何指导,我们将不胜感激。

你可以尝试这样做:

df = pd.concat([pd.read_sql(querystring, cnxn, params = [i] for i in orders], ignore_index=True)

所以你不需要额外的循环...

或者,如果您的 orders 列表相对较小,您可以 select 所有行 "in one shot":

querystring = 'select order_number, creation_date from table_name where order_number in ({})'.format(','.join(['?']*len(orders)))

df = pd.read_sql(querystring, cnxn, params=orders)

生成SQL

In [8]: querystring
Out[8]: 'select order_number, creation_date from table_name where order_number in (?,?,?,?)'

需要分配结果:

df = df.append(pd.read_sql(querystring, cnxn, params = [i]))

怎么样

for i in orders: df = df.append(pd.read_sql(querystring, cnxn, params = [i]))

您可以使用以下代码直接创建数据框:

df = pd.read_sql_query(querystring, cnxn)