Sco*_*les 6 python postgresql dataframe pandas
我正在通过 Django(新的迁移)向具有 100 多列的 Postgres 表添加一列。如何使用pandasdata_frame 中的数据更新 PostgreSQL 表中的列?Postgres SQL UPDATE的伪代码是:
UPDATE wide_table wt
SET wt.z = df.z
WHERE date = 'todays_date'
Run Code Online (Sandbox Code Playgroud)
这样做的原因是我正在data_frame使用S3(这是df.z)中的 CSV计算列。Postgres 更新的文档使用起来很简单,但我不确定如何通过 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 | ...
Run Code Online (Sandbox Code Playgroud)
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
???
Run Code Online (Sandbox Code Playgroud)
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 | ...
Run Code Online (Sandbox Code Playgroud)
注意:z 中的值每天都会变化,因此简单地创建另一个表来保存这些z值并不是一个很好的解决方案。另外,我真的希望避免删除所有数据并将其添加回来。
遇到了类似的问题,目前接受的解决方案对我来说太慢了。我的表有 500k+ 行,我需要更新 100k+ 行。经过长时间的研究和反复试验,我得出了一个有效且正确的解决方案。
这个想法是使用 psycopg 作为你的作者并使用临时表。 df是包含要设置的值的熊猫数据框。
import psycopg2
conn = psycopg2.connect("dbname='db' user='user' host='localhost' password='test'")
cur = conn.cursor()
rows = zip(df.id, df.z)
cur.execute("""CREATE TEMP TABLE codelist(id INTEGER, z INTEGER) ON COMMIT DROP""")
cur.executemany("""INSERT INTO codelist (id, z) VALUES(%s, %s)""", rows)
cur.execute("""
UPDATE table_name
SET z = codelist.z
FROM codelist
WHERE codelist.id = vehicle.id;
""")
cur.rowcount
conn.commit()
cur.close()
conn.close()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5790 次 |
| 最近记录: |