【发布时间】:2019-03-07 20:35:01
【问题描述】:
我通过 Django(新迁移)将单个列添加到具有 100 多列的 Postgres 表中。如何使用pandas data_frame 中的数据更新 PostgreSQL 表中的列? Postgres SQL UPDATE 的伪代码是:
UPDATE wide_table wt
SET wt.z = df.z
WHERE date = 'todays_date'
这样做的原因是我正在使用S3 中的CSV 计算data_frame 中的列(这是df.z)。 Postgres update 的文档使用起来很简单,但我不确定如何通过 Django、sqlalchemy、pyodbc 等来执行此操作。
如果这有点令人费解,我深表歉意。一个小而不完整的例子是:
宽表(更新前列z)
identifier | x | y | z | date
foo | 2 | 1 | 0.0 | ...
bar | 2 | 8 | 0.0 | ...
baz | 3 | 7 | 0.0 | ...
foo | 2 | 8 | 0.0 | ...
foo | 1 | 5 | 0.0 | ...
baz | 2 | 8 | 0.0 | ...
bar | 9 | 3 | 0.0 | ...
baz | 2 | 3 | 0.0 | ...
Python sn-p 示例
def apply_function(identifier):
# Maps baz-> 15.0, bar-> 19.6, foo -> 10.0 for single date
df = pd.read_csv("s3_file_path/date_file_name.csv")
# Compute 'z' based on identifier and S3 csv
return z
postgres_query = "Select identifier from wide_table"
df = pd.read_sql(sql=postgres_query, con=engine)
df['z'] = df.identifier.apply(apply_function)
# Python / SQL Update Logic here to update Postgres Column
???
宽表(更新后列z)
identifier | x | y | z | date
foo | 2 | 1 | 10.0 | ...
bar | 2 | 8 | 19.6 | ...
baz | 3 | 7 | 15.0 | ...
foo | 2 | 8 | 10.0 | ...
foo | 1 | 5 | 10.0 | ...
baz | 2 | 8 | 15.0 | ...
bar | 9 | 3 | 19.6 | ...
baz | 2 | 3 | 15.0 | ...
注意:z 中的值每天都会变化,因此简单地创建另一个表来保存这些 z 值并不是一个很好的解决方案。另外,我真的希望避免删除所有数据并重新添加。
【问题讨论】:
标签: python pandas postgresql dataframe