2016-06-17 1 views
3

私はRから来ていますが、これはPythonでさまざまな理由で行う必要があります。 これは、私のPythonでPandas、PyODBCなどの何ものよりも基本的なPEBKACの問題である可能性があります。pd.read_sql出力からのパンダデータフレームへの追加

私に同行してください。

私の現在の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しようとすると、私は(メーリングリストへ、またはタプル、または辞書)リストからのparamsとpd.read_sqlを行うことが可能でなければならないので、確実に

Empty DataFrame 
Columns: [] 
Index: [] 

を取得し、それらを追加します結果はpd.DataFrame()の行として返されます。

しかし、スタック検索、グーグル、またはPythonで一般的に失敗しています。

ここのガイダンスは大変ありがとうございます。

答えて

1

どの程度

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

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 (?,?,?,?)' 
: "ワンショットで、" 行
2

結果を割り当てる必要があります:

df = df.append(pd.read_sql(querystring, cnxn, params = [i])) 
関連する問題