2017-04-11 80 views
0

我想在從數據幀pandas一個MySQL表(mydata1)來更新列rtrendgetdata1)柱rtrend確保值對應於相應的日期(dtSQL鍊金更新多個WHERE條件

例如rtrend2016-08-09 from getdata1 df更新相應的MySQL mydata12016-08-09rtrend值。

另外指定一個特定的安全ID例如security_id == 'GS'在這種情況下

updateexample = update(mydata1) 
     .where(mydata1.c.security_id=='GS', mydata1.c.dt==getdata1['dt']) 
     .values(rtrend=getdata1['rtrend']) 

這將產生AttributeError: 'Series' object has no attribute 'translate'請會有人用正確的方式去幫助呢?當前表和數據幀的

實施例:

大熊貓數據幀 'getdata1'

dt   | security_id | rtrend 
2016-08-09 | GS   | 1 
2016-08-10 | GS   | -1 

MySQL表 'mydata1'

dt   | security_id | rtrend 
2016-08-09 | GS   | NULL 
2016-08-10 | GS   | NULL 
+2

瞭解批量更新; [示例](http://stackoverflow.com/a/25720751/223424)。這個想法是''bindparam'你想要更新的字段,並且將一個迭代器提供給'.execute'。可能'getdata1'的輸出可以直接使用。 (我希望你只是爲了創建一個例子而重命名了所有的對象,並且在你的真實代碼中使用了描述性的名字。) – 9000

+0

謝謝Stefano。爲了示例的目的,只是重命名了對象 – Matthewj28

回答

1

這裏使用上述我的解決辦法指導

http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql.expression.bindparam

updatecode1 = update(mydata1). 
    where(and_(mydata1.c.dt == bindparam('1dt'), mydata1.c.security_id == bindparam('1security_id'))). 
    values({'rtrend' : bindparam('1rtrend'),'ma200' : bindparam('1ma200')}) 

然後循環來定義每個值,並更新表

b1 = 'GS' 

i = 0 

for i in range(len(getdata1)): 
    a1 = getdata1.iloc[i]['dt'] 
    c1 = int(getdata1.iloc[i]['rtrend']) 
    d1 = float(getdata1.iloc[i]['MA200']) 

    conn.execute(updatecode1, {'1dt' : a1, '1security_id' : b1, '1rtrend' : c1, '1ma200' : d1}) 

我敢肯定,有可能比這種方式循環更有效的方式,但這個工作了我的問題。

注意:在上面的'c1'和'd1'中,我用int()和float()來簡單地將數據類型與我的表匹配。