【发布时间】: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
【问题讨论】:
-
我不会以表格格式存储数据,而是使用三列表格:
Date、Data和Source。 -
但是当我想提取某些列以使用熊猫进行数据分析时,我需要它采用这种格式,而且一个日期也会有这么多数据点,但如果我按照你的方式做,我不会看到那个
-
SELECT * FROM my_table WHERE Source in ('Data1', 'Data2'),然后在 pandas 中旋转结果。 -
那么我如何以您的格式插入我的 20,000 个表格?有这个命令吗?
-
另外,如果我的来源是 ('Data1','Data2'...... ) 有 5000 列,会有延迟吗?
标签: python pandas postgresql dataframe csv