我来自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。"
很抱歉截图,无法在此处获取格式。
阅读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中都失败了(这三种情况都有明显的可能性)。
非常感谢任何指导。
答案 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)