2017-04-11 61 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()来简单地将数据类型与我的表匹配。