如何使用Pandas

时间:2017-05-19 14:54:35

标签: python mysql pandas mysql-python

熊猫新手。

SQL表由3列组成(ID是主键):

> ID    VALUE1    VALUE2 
> 1       11        28 
> 2       21      (None) 
> 3       31        56 
> 4       41      (None)

使用Pandas我加载VALUE2为的所有行(无)

query = "SELECT * FROM `TABLE_NAME`  WHERE (`VALUE2` IS NULL)"
engine = create_engine("mysql://user:pwd@ip/db"
df = pd.read_sql(query, con=engine)
engine.dispose()

到目前为止一切都还好。

在加载之后,根据某些规则计算缺失的VALUE2。

问题

如果我用

更新数据库
df.to_sql(TABLE_NAME, con=engine, if_exists="replace", index=False)

未加载到数据框中的所有原始行都是LOST:

> ID    VALUE1    VALUE2 
> 2       21       103 
> 4       41        72

有没有办法更新原始线条?

我想获得这个:

> ID    VALUE1    VALUE2 
> 1       11        28 
> 2       21       103 
> 3       31        56 
> 4       41        72

看起来整个表都被重写而不是更新......

加载整个表只是为了更新几行是非常低效的。这实际上可以解决问题,但这是不可接受的。

关于“为什么”的任何想法?

2 个答案:

答案 0 :(得分:2)

您正在使用if_exists="replace"选项。

从Pandas文档(我的大胆):

  

替换:如果表存在,删除它,重新创建,并插入数据。

所以它完全按照你的要求去做。您可以尝试使用if_exists="append"进行游戏,但它仍然可能无法为您提供您正在寻找的行为。

或者,您可以使用MySQLdb直接与表进行交互,并使用UPDATE

答案 1 :(得分:1)

这是混合两个世界中最好的一个案例。做你现在正在做的事,但使用不同的表。这本质上是一个临时表,但AFAIK熊猫并不支持它们,所以让我们稍后放弃它。

df.to_sql(tmp_table_name, con=engine, if_exists="replace", index=False)

然后我们使用INSERT ON DUPLICATE KEY语法

INSERT INTO TABLE_NAME (SELECT * FROM tmp_table) ON DUPLICATE KEY UPDATE a = VALUES(a), b=VALUES(b) ....

这通常是一种快速操作。