gpt4 book ai didi

pandas - 将 Pandas 数据框变成内存中的类似文件的对象?

转载 作者:行者123 更新时间:2023-12-03 23:08:34 26 4
gpt4 key购买 nike

我每天将大约 2 到 250 万条记录加载到 Postgres 数据库中。

然后我用 pd.read_sql 读取这些数据以将其转换为数据框,然后我进行一些列操作和一些小的合并。我将这些修改后的数据保存为单独的表格供其他人使用。

当我做 pd.to_sql 它需要永远。如果我保存一个 csv 文件并在 Postgres 中使用 COPY FROM,整个过程只需要几分钟,但服务器位于另一台机器上,在那里传输文件很痛苦。

使用 psycopg2,看起来我可以使用 copy_expert 从批量复制中受益,但仍然使用 python。如果可能的话,我想避免编写实际的 csv 文件。我可以使用 pandas 数据框在内存中执行此操作吗?

这是我的 Pandas 代码示例。如果可能的话,我想添加 copy_expert 或其他东西以更快地保存这些数据。

    for date in required_date_range:
df = pd.read_sql(sql=query, con=pg_engine, params={'x' : date})
...
do stuff to the columns
...
df.to_sql('table_name', pg_engine, index=False, if_exists='append', dtype=final_table_dtypes)

有人可以帮我提供示例代码吗?我还是更喜欢使用 pandas,在内存中这样做会很好。如果没有,我将只编写一个 csv 临时文件并这样做。

编辑-这是我的最终代码。每个日期(数百万行)只需要几百秒,而不是几个小时。

to_sql = """使用 CSV header 从标准输入复制 %s"""
def process_file(conn, table_name, file_object):
fake_conn = cms_dtypes.pg_engine.raw_connection()
fake_cur = fake_conn.cursor()
fake_cur.copy_expert(sql=to_sql % table_name, file=file_object)
fake_conn.commit()
fake_cur.close()


#after doing stuff to the dataframe
s_buf = io.StringIO()
df.to_csv(s_buf)
process_file(cms_dtypes.pg_engine, 'fact_cms_employee', s_buf)

最佳答案

Python 模块 io ( docs ) 具有用于类文件对象的必要工具。

import io

# text buffer
s_buf = io.StringIO()

# saving a data frame to a buffer (same as with a regular file):
df.to_csv(s_buf)

编辑。
(我忘了)为了之后从缓冲区中读取,它的位置应该设置为开头:
s_buf.seek(0)

我不熟悉 psycopg2但根据 docs两个 copy_expertcopy_from可以使用,例如:
cur.copy_from(s_buf, table)

(对于 Python 2,请参阅 StringIO。)

关于pandas - 将 Pandas 数据框变成内存中的类似文件的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38204064/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com