2015-10-23 70 views
3

我試圖建立一個表時SQLAlchemy的,至於現在的列中出現的字母順序設置列的順序,我現在有:設置排序

def data_frame(query, columns): 
    def make_row(x): 
     return dict([(c, getattr(x, c)) for c in columns]) 
    return pd.DataFrame([make_row(x) for x in query]) 

PackL = create_engine('mssql+pyodbc://u:[email protected]/db1?driver=SQL Server', echo=False) 
Fabr = create_engine('mssql+pyodbc://u:[email protected]/db2?driver=SQL Server', echo=False) 
Session = sessionmaker(bind=PackL) 
session = Session() 
Base = declarative_base() 
metadata = MetaData() 

class Tranv(Base): 
    __tablename__= "Transactions" 
    __table_args__= {'autoload': True, 'autoload_with':PackL} 

newvarv = session.query(Tranv).filter_by(status='SCRAP').filter(Tranv.time_stamp. 
between('2015-10-01', '2015-10-09')) 

session.close() 

dfx = data_frame(newvarv, ['action', 'employee_number', 'time_stamp', 'qty', 
'part_number', 'card_number']) 

當前dfx具有按字母順序排列的列,但我希望它按照我在創建數據框dfx時定義列的順序對它們排序。因此,訂單可以是行動,員工編號,時間戳,數量,零件編號,卡號。我可以很容易地用熊貓做到這一點,但這似乎是額外的(和不必要的)步驟。

我搜索了文檔,谷歌,& stackoverflow但沒有什麼真的似乎符合我的需求。由於我還是SQLAlchemy的新手,我很感激任何幫助。我的想法是,因爲我自動加載表格,我無法輕鬆定義列的順序(我確定有一種解決方法,但沒有線索在可能找到的文檔中的位置) ?

+1

我想你也可以使用'dfx = pd.read_sql_query(newvarv,PackL)'將查詢轉換爲數據框而不是編寫自己的方法(但不完全確定)。 – joris

+1

要對我自己的評論發表評論,您需要傳遞'newvarv.selectable',查看我的更新回答 – joris

回答

2

你的列不按你指定的順序排列的原因與sql查詢或sqlalchemy無關。這是因爲您將查詢輸出轉換爲字典,然後將其輸入到DataFrame
由於python中的字典沒有順序,熊貓將按字母順序對其進行排序以獲得可預測的輸出。

使用dict目前的做法,你可以隨時通過做dfx.reindex(columns=['action', ..., 'card_number'])


除了解釋更改列的順序之後,爲什麼它不在你的情況下令,有可能更好的方法解決這個問題:

  • 使用內建pd.read_sql_query。當會話和查詢對象時,你可以在selectable屬性傳遞給read_sql_query將其轉換爲一個數據幀:

    query = session.query(Table)... 
    df = pd.read_sql_query(query.selectable, engine) 
    
  • 沒有轉換爲一個字典,但保持輸出作爲你喂到DataFrame元組:此將保持查詢輸出的順序。
+0

謝謝您的理解;沒有考慮查詢輸出轉換。我已經嘗試過pd.read_sql_query(事實上,我拿出了我的data_frame函數並用你之前的評論替換了它),但我總是得到這個錯誤:sqlalchemy.exc.InvalidRequestError:不可執行的對象類型: grlaer

+1

是的,很抱歉,您是正確的。但是,您可以傳遞Query對象的'selectable'屬性:'pd.read_sql_query(query.selectable,engine)'。這樣,您不需要自己的書面方法將其轉換爲數據框。 – joris

+0

謝謝,這可能是最簡單的解決方案,而且比我之前做的更平易近人。 – grlaer