【问题标题】:Merge multiple python pandas data frames into an SQL database using sqlalchemy (postgresql)使用 sqlalchemy (postgresql) 将多个 python pandas 数据帧合并到一个 SQL 数据库中
【发布时间】:2020-10-16 05:14:19
【问题描述】:

我有一个 postgresql 数据库,我在 python 中使用 sqlalchemy 访问它。

我正在尝试创建一个由一堆 csv 文件或数据框组成的数据库。

csv 文件长这样,大约有 20,000 个,其中一些有

Data1.csv

Date         Data1
01-Jan-2000  122.1
...
09-Oct-2020  991.2

Data2.csv

Date         Data2
01-Feb-2010  101.1
...
09-Oct-2020  331.2

Data3.csv

Date         Data3a  Data3b Data3c.....
15-Dec-2015  1125.2 ....
...
09-Oct-2020  35512.2 ....
...
...

Data20000.csv

所以我要做以下事情,

import pandas as pd
import sqlalchemy
import psycopg2

engine = sqlalchemy.create_engine('postgresql://user@127.0.0.1',isolation_level='AUTOCOMMIT')

engine.execute('CREATE DATABASE testdb')

df = pd.read_csv("/Users/user/Documents/data/Data1.csv",index_col=0)
df.to_sql('temp',con=engine,if_exists='replace')

我可以看到这会创建一个名为 testdb 的空数据库和一个名为 temp 的表。

如何将temp 表合并到testdb 表中,这样我就可以创建一个for循环并制作一个这样的表

Date Data1 Data2 Data3a Data3b Data3c
....
....

如果我使用 pandas,我会这样做,

testdb = pd.DataFrame()
df = pd.read_csv("/Users/user/Documents/data/Data1.csv",index_col=0)
testdb = pd.merge(testdb,df,how='outer',left_index=True, right_index=True)

我试过engine.execute('SELECT * from df OUTER JOIN testdb')

但我收到以下错误

ProgrammingError: (psycopg2.errors.SyntaxError) syntax error at or near "OUTER"
LINE 1: SELECT * from df OUTER JOIN testdb
                           ^

[SQL: SELECT * from df OUTER JOIN testdb]
(Background on this error at: http://sqlalche.me/e/13/f405)

在这里合并我的数据的正确方法是什么?

更新:

所以我在这个目录中有 1389 个文件, 每一个大约是 15 年的每日数据 x 8 列

我尝试添加大约 300 个文件,但速度变慢了。

我在这里做错了什么?

frame = pd.DataFrame()

length = len(os.listdir(filepath))
for filename in os.listdir(filepath):
    file_path = os.path.join(filepath, filename)
    print(length,end=" ")
    df = pd.read_csv(file_path,index_col=0)
    df = pd.concat([df[[col]].assign(Source=f'{filename[:-4]}-{col}').rename(columns={col: 'Data'}) for col in df])
    frame = frame.append(df)
    length-=1

【问题讨论】:

  • 我不会以表格格式存储数据,而是使用三列表格:DateDataSource
  • 但是当我想提取某些列以使用熊猫进行数据分析时,我需要它采用这种格式,而且一个日期也会有这么多数据点,但如果我按照你的方式做,我不会看到那个
  • SELECT * FROM my_table WHERE Source in ('Data1', 'Data2'),然后在 pandas 中旋转结果。
  • 那么我如何以您的格式插入我的 20,000 个表格?有这个命令吗?
  • 另外,如果我的来源是 ('Data1','Data2'...... ) 有 5000 列,会有延迟吗?

标签: python pandas postgresql dataframe csv


【解决方案1】:

在将记录写入数据库表之前,您可以使用 pandas 库在数据帧级别合并它们。

df1 = pd.read_csv("/Users/user/Documents/data/Data1.csv",index_col=0)
df2 = pd.read_csv("/Users/user/Documents/data/Data2.csv",index_col=0)
df3 = pd.read_csv("/Users/user/Documents/data/Data3.csv",index_col=0)

final_df = pd.concat([df1, df2, df3], axis=1)
final_df.to_sql('temp',con=engine,if_exists='replace')

【讨论】:

  • 但是,当帧达到3000时,数据帧真的变慢了,这就是为什么我想创建一个postgresql表,就像我提到的,有20,000帧,使用你的方法,我必须合并首先将 20,000 帧放入 pandas。
  • 如果有 20,000 个数据帧需要按列合并,它可能会达到 postgresql 每个表的最大列数(1600)。 postgresql.org/docs/13/limits.html
  • 那有解决办法吗?我需要存储一个大表,以便我每天可以轻松访问和更新列。
  • 在处理数据时可以破坏更宽的表并加入。或者,正如用户:亚历山大所说,以三列格式存储数据并在处理时处理它们。或者 Pandas 可以处理数百万列(系统中的内存是硬限制)。所以使用 pandas 本身来处理数据。
猜你喜欢
  • 1970-01-01
  • 2020-03-03
  • 2018-01-31
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2022-01-20
  • 2016-01-19
相关资源
最近更新 更多