首页 > 解决方案 > 从 pandas 数据帧批量更新 peewee 数据库的最有效方法

问题描述

数据库如下所示:

date            value
2000-01-01      foo
2000-01-01      foo
2000-01-01      foo
2000-01-02      bar
2000-01-02      bar
2000-01-02      bar
2000-01-10      yyy
2000-01-10      yyy
2000-01-10      yyy

Pandas 数据框MyDataframe如下所示:

date            value
2000-01-01      new_foo
2000-01-02      new_bar
2000-01-10      new_yyy

正如您可能已经猜到的那样,我需要数据库看起来像这样:

date            value
2000-01-01      new_foo
2000-01-01      new_foo
2000-01-01      new_foo
2000-01-02      new_bar
ecc...

我可以循环MyDataframe并运行一系列.update

for date, value in MyDataframe:
    query = MyModel.update(value=value).where(MyModel.date == date).execute()
    query.execute()

我的问题是:有没有办法通过一次调用execute()(或任何其他更有效的方式)来做到这一点?像bulk_execute(array_of_queries)什么?

有没有办法将数据框直接提供给 .update()?像这样:

MyModel.update(value=MyDataframe.loc[MyModel.date]).execute()

不幸的是,这不起作用:传递给的索引.loc[]不是实际值,而是一个DateTimeField对象。事实上,它给出了这个错误:

KeyError('the label [<DateTimeField: MyModel.date>] is not in the [index]',)

文档建议您可以在更新函数中运行实际代码,并提供以下示例:

Employee.update(bonus=(Employee.bonus + (Employee.salary * .1)))

标签: pythonpandaspeewee

解决方案


您可以尝试合并数据框并替换原始值列。


推荐阅读