从pd.read_sql输出

时间:2016-06-17 19:50:03

标签: python pandas dataframe pyodbc

我来自R,但出于各种原因需要在Python中执行此操作。 与Pandas,PyODBC或其他任何东西相比,这对我的Python来说可能是一个基本的PEBKAC问题。

请耐心等待。

我目前的Python 3代码:

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

代码输出的内容是: enter image description here

很抱歉截图,无法在此处获取格式。

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

df = pd.DataFrame()

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

看起来运行正常(无论如何都没有抛出错误)。

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

Empty DataFrame
Columns: []
Index: []

当然,必须可以使用列表中的params(或元组或字典,ymmv)执行pd.read_sql,并将这些结果作为行添加到pd.DataFrame()中。

但是,我在Stack搜索,Google搜索或Python中都失败了(这三种情况都有明显的可能性)。

非常感谢任何指导。

4 个答案:

答案 0 :(得分:3)

需要分配结果:

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

答案 1 :(得分:2)

怎么样

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

答案 2 :(得分:1)

您可以尝试这样做:

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

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

或者,如果您的orders列表相对较小,则可以一次性选择所有行"":

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 (?,?,?,?)'

答案 3 :(得分:0)

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

df = pd.read_sql_query(querystring, cnxn)