2016-06-17 16 views
3

Ich komme aus R, muss dies aber aus verschiedenen Gründen in Python tun. Das könnte ein grundlegendes PEBKAC Problem mit meinem Python mehr als alles andere mit Pandas, PyODBC oder irgendetwas anderem sein.Anhängen an einen Pandas-Datenrahmen Aus einer pd.read_sql-Ausgabe

Bitte tragen Sie mit mir.

Mein aktueller Python 3-Code:

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

Was ich brauche, ist ein Datenrahmen mit den Spaltennamen "order_number" und "creation_date."

Was die Code Ausgänge: enter image description here

Sorry für den Screenshot, konnte nicht die Formatierung direkt hier.

die dataframe.append page gelesen hatte, habe ich versucht, dies:

df = pd.DataFrame() 

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

Das fein zu laufen scheint (keine Fehler geworfen, sowieso).

Aber wenn ich die Ausgabe df versuchen, bekomme ich

Empty DataFrame 
Columns: [] 
Index: [] 

So muß es doch möglich sein, eine pd.read_sql mit params aus einer Liste zu tun (oder Tupel oder Wörterbuch, ymmv) und fügen Sie diejenigen, Ergebnisse als Zeilen in eine PD.DataFrame().

Ich bin jedoch versagt entweder an meinem Stapel der Suche, googeln oder Python im Allgemeinen (mit einer deutlichen Möglichkeit aller drei).

Jede Anleitung hier würde sehr geschätzt werden.

Antwort

1

Wie wäre es

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

1

Sie können versuchen, es auf diese Weise zu tun:

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

so dass Sie nicht eine zusätzliche Schleife brauchen ...

alternativ, wenn Ihre orders Liste relativ klein ist, können Sie auswählen, alle Ihre "in einem Schuss" Reihen:

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) 

generierten SQL

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

Sie benötigen das Ergebnis zuzuweisen:

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