2017-02-19 201 views
1

我想在大熊貓數據幀執行從列此更新查詢如何更新的MS Access多行。從熊貓數據框中

我的數據框看起來象下面這樣:

Data Table Screeshot

回答

1

不幸的是,MS接入(特別是其磁盤級噴氣/ ACE引擎不GUI .exe程序)不支持SQLAlchemy以允許pandas.to_sql()方法,理想情況下,您可以將數據庫推送到數據庫中的臨時表以運行UPDATE final INNER JOIN temp ...查詢來更新最終表,這是一個更快的方法而不是遍歷行。

幸運的是,MS Access的Jet/ACE引擎可以查詢csv文件,就好像它們是指定文件路徑的表,然後指定csv文件的名稱一樣。因此,請考慮導出數據幀to_csv,然後使用Make-Table查詢創建臨時表,最後運行更新連接查詢。如果存在,則使用低於try/except來刪除該表(因爲IF EXISTS命令在MS Access SQL中不可用)。

df.to_csv('C:\Path\To\CSV\Output.csv', index=False) 

try: 
    cursor.execute("SELECT * INTO tblhis_ventas_Temp" +\ 
        " FROM [text;HDR=Yes;FMT=Delimited(,);Database=C:\Path\To\CSV].Output.csv") 
    conn.commit() 

    cursor.execute("UPDATE tblhis_ventas f INNER JOIN tblhis_ventas_Temp t" + \ 
        " ON f.contrato = t.contrato AND f.estado = t.estado" + \ 
        " SET f. portabilidad = t.portabilidad") 
    conn.commit() 

except Exception as e:  
    if 'already exists' in str(e): 
     cursor.execute("DROP TABLE tblhis_ventas_Temp") 
     conn.commit() 
    else: 
     print(e) 

cursor.close() 
conn.close() 

不,我們不能直接使用CSV文件中UPDATE查詢(繞過臨時表的過程)作爲CSV是隻讀的,而不是更新記錄。有趣的是,您可以在INSERT...SELECT中使用CSV。

+0

它的作品!速度非常快。我不知道ms訪問中的臨時csv文件。我非常感謝你們所有人。 – calobeto

0

迭代行,並更新逐一:

sql = 'UPDATE tblhis_ventas SET portabilidad = ? WHERE contrato = ? and estado = ?' 
for index, row in df.iterrows(): 
    cursor.execute(sql, [row['portabilidad'], row['contrato'], row['estado']]) 
+0

它的工作原理!問題是表格超過10K,更新一個字段需要10分鐘以上,我需要10個字段以上;)。有一個快速的方法嗎? – calobeto

+0

@calobeto,你能顯示整個代碼嗎?如果不知道選擇了哪些數據,以及使用'df'完成了哪些操作,我無法告訴你如何改進它,甚至不能告訴你是否可能。 – falsetru