熊猫新手。
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
看起来整个表都被重写而不是更新......
加载整个表只是为了更新几行是非常低效的。这实际上可以解决问题,但这是不可接受的。
关于“为什么”的任何想法?
答案 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) ....
这通常是一种快速操作。