【问题标题】:How can I convert Sqlalchemy table object to Pandas DataFrame?如何将 Sqlalchemy 表对象转换为 Pandas DataFrame?
【发布时间】:2014-10-05 12:50:09
【问题描述】:

是否可以将检索到的 SqlAlchemy 表对象转换为 Pandas DataFrame 或者我是否需要为此目的编写特定函数?

【问题讨论】:

  • 你考虑过使用pandas.read_sql吗?
  • 是的,但 SqlAlchemy 在我的项目中还有其他用例。
  • pandas.read_sql 可以使用 SqlAlchemy 引擎。
  • 如果您想使用其他可选而不只是表格(包括使用 orm),请查看:stackoverflow.com/a/29528804/1273938

标签: python pandas sqlalchemy


【解决方案1】:

这可能不是最有效的方法,但我可以使用 automap_base 反映数据库表,然后将其转换为 Pandas DataFrame。

import pandas as pd
from sqlalchemy.ext.automap import automap_base
from sqlalchemy import create_engine
from sqlalchemy.orm import Session

connection_string = "your:db:connection:string:here"
engine = create_engine(connection_string, echo=False)
session = Session(engine)

# sqlalchemy: Reflect the tables
Base = automap_base()
Base.prepare(engine, reflect=True)

# Mapped classes are now created with names by default matching that of the table name.
Table_Name = Base.classes.table_name

# Example query with filtering
query = session.query(Table_Name).filter(Table_Name.language != 'english')

# Convert to DataFrame
df = pd.read_sql(query.statement, engine)
df.head()

【讨论】:

  • 我对这个和上面的(更多赞成的)答案进行了基准测试。除了更简单之外,这个答案的速度大约是原来的两倍。不错的作品。另外,谢谢。
  • 非常 Python 且易于扩展。谢谢。
【解决方案2】:

我想我以前试过这个。这很 hacky,但对于全表 ORM 查询结果,这应该可以工作:

import pandas as pd

cols = [c.name for c in SQLA_Table.__table__.columns]
pk = [c.name for c in SQLA_Table.__table__.primary_key]
tuplefied_list = [(getattr(item, col) for col in cols) for item in result_list]

df = pd.DataFrame.from_records(tuplefied_list, index=pk, columns=cols)

部分查询结果 (NamedTuples) 也可以,但您必须构造 DataFrame columnsindex 以匹配您的查询。

【讨论】:

  • 只需将pandas.read_sql 与 SQLAlchemy 引擎一起使用。这很简单。
  • 如何在 ORM 查询中使用pandas.read_sql,例如:session.query(MyORMTable).limit(100).all()
  • pandas.read_sql_table('MyTable', MySQLEngine) 看这里pandas.pydata.org/pandas-docs/stable/…
  • 非常酷。看起来它并没有转换现有的查询结果(或使用 ORM),这就是我解释原始问题的方式。
  • 这里的result_list 是什么?尝试运行此程序时出现错误。我也有现有的查询结果,我想将其转换为 pandas 数据框(而不是仅仅加载一个直表)
猜你喜欢
  • 2015-06-14
  • 2015-09-15
  • 2017-01-13
  • 1970-01-01
  • 2022-07-28
  • 2015-10-28
  • 2020-07-29
  • 2019-01-14
  • 2023-01-20
相关资源
最近更新 更多