相关疑难解决方法(0)

将pandas数据帧转换为内存中类似文件的对象?

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

然后,我使用pd.read_sql读取此数据,将其转换为数据帧,然后进行一些列操作和一些次要合并.我将此修改后的数据保存为单独的表供其他人使用.

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

使用psycopg2,看起来我可以使用copy_expert从批量复制中受益,但仍然使用python.我希望,如果可能的话,避免编写实际的csv文件.我可以在内存中使用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)
Run Code Online (Sandbox Code Playgroud)

有人可以用示例代码帮助我吗?我更喜欢使用熊猫,在内存中做它会很好.如果没有,我将只写一个csv临时文件并以这种方式执行.

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

to_sql ="""COPY%s FROM STDIN WITH CSV HEADER"""

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)
Run Code Online (Sandbox Code Playgroud)

psycopg2 pandas

12
推荐指数
2
解决办法
8184
查看次数

标签 统计

pandas ×1

psycopg2 ×1