解压缩数据框字典

时间:2019-09-27 04:26:51

标签: python pandas dataframe dictionary

我已经使用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。主要目标是能够使用与键相同的名称引用数据框,并在数据库中(我可以从那里处理数据)。

我尝试了以下操作:

  • 使用.keys()和.values()创建列表并为分配列表编制索引
  • 使用setattr遍历键和值的列表,以将df名称(作为字符串,在列表中)分配给相应的数据帧。

我也知道这是从四年前开始的this question的重提,但没有给出明确的答案。

如果键(作为列表)为:

['name1','name2','name3']

并且这些值是对应的数据帧,我希望能够运行:

[In] name1
[Out] Col1 |  Col2 | Col3
      --------------------
      foo  |    2  |  a
      bar  |    17 |  b
      ...

感谢大家提供的任何帮助!

1 个答案:

答案 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: []