我已经使用sqlalchemy从PostgreSQL数据库中读取表,并将它们存储在字典中(键是表名,值是数据帧)。我可以一次访问它们,但想扩展解决方案,以便将给定数据库/模式中的所有表都作为pandas数据框。我要原样导入的代码如下:
import os
import pandas as pd
import psycopg2
from sqlalchemy import create_engine
engine = create_engine(os.environ['postgres_credentials'] +'db')
conn = engine.connect()
trans = conn.begin()
#Initialize empty dictionary
frames_dict = {}
#Use loop and pd.read_sql() to read tables from DB
table_names = engine.table_names()
select_template = 'SELECT * FROM {table_name}'
for tname in table_names:
query = select_template.format(table_name = tname)
frames_dict[tname] = pd.read_sql(query, conn)
# Close connection
conn.close()
此操作成功获取table_name:dataframe的key:value。主要目标是能够使用与键相同的名称引用数据框,并在数据库中(我可以从那里处理数据)。
我尝试了以下操作:
我也知道这是从四年前开始的this question的重提,但没有给出明确的答案。
如果键(作为列表)为:
['name1','name2','name3']
并且这些值是对应的数据帧,我希望能够运行:
[In] name1
[Out] Col1 | Col2 | Col3
--------------------
foo | 2 | a
bar | 17 | b
...
感谢大家提供的任何帮助!
答案 0 :(得分:1)
我想到的一件事是使用namedtuple
中的collections
:
from collections import namedtuple
import pandas as pd
supposedly_your_dict = {
'table_1': pd.DataFrame(columns=['t_1_col_1', 't_1_col_2']),
'table_2': pd.DataFrame(columns=['t_2_col_1', 't_2_col_2']),
'table_3': pd.DataFrame(columns=['t_3_col_1', 't_3_col_2'])
}
DBSnapshot = namedtuple('DBSnapshot', supposedly_your_dict.keys())
db_tables = DBSnapshot(**supposedly_your_dict)
现在,您应该能够以所需的方式访问表。 db_tables.table_1
导致:
Empty DataFrame
Columns: [t_1_col_1, t_1_col_2]
Index: []