如何将CursorResult对象转换为Pandas Dataframe?

下面的代码生成CursorResult-Object:

from sqlalchemy.orm import Session
from sqlalchemy import create_engine

engine = create_engine(f"mssql+pyodbc://{db_server}/{db_name}?trusted_connection=yes&driver={db_driver}")
q1 = "SELECT * FROM my_schema.my_table"

with Session(engine) as session:
    results = session.execute(q1)
    session.commit()

type(results)
>sqlalchemy.engine.cursor.CursorResult

由于我找不到从CursorResult中提取相关信息的方法,它try 了以下操作:

# Extracting data as we go
with Session(engine) as session:
    results = session.execute(q1)
    description = results.cursor.description
    rows = results.all()
    session.commit()

# Extracting column names
colnames = [elem[0] for elem in description]

# Extracting types
types = [elem[1] for elem in description]

# Creating dataframe
import pandas as pd
pd.DataFrame(rows, columns=colnames)

但是dtype呢?如果我只是把它们放进go ,它不会起作用,尽管看起来它们都是Python 类型.对于我的用例,我必须使用Session,所以我不能使用第一个建议来做classic :

# I cannot use
pandas.read_sql(q1, engine)

这样做的原因是我必须在相同的上下文中进行多批查询,这就是我使用Session类的原因.

推荐答案

IIUC,使用pd.DataFrame构造函数即可.dtypes设置正确.

# sqlalchemy==2.0.16
# pandas==2.0.2
from sqlalchemy.sql import text

with Session(engine) as session:
    results = session.execute(text(q1))
    df = pd.DataFrame(results)
    # session.commit()  # commit is irrelevant if you don't write data

在我的数据库上测试:

>>> df.head()
                    Scenario Attribute      Process  Period Region Vintage            PV
0  WithHHP16HinsHE0CCS109LHP   VAR_Cap  EVTRANS_H-L    2014     FR    None    296.071141
1  WithHHP16HinsHE0CCS109LHP   VAR_Cap  EVTRANS_H-M    2014     FR    None     11.770909
2  WithHHP16HinsHE0CCS109LHP   VAR_Cap   IMPELCHIGA    2014     FR    None  11851.674497
3  WithHHP16HinsHE0CCS109LHP   VAR_Cap  EVTRANS_H-L    2015     FR    None    296.071141
4  WithHHP16HinsHE0CCS109LHP   VAR_Cap  EVTRANS_H-M    2015     FR    None     11.770909

>>> df.dtypes
Scenario      object
Attribute     object
Process       object
Period         int64
Region        object
Vintage       object
PV           float64
dtype: object

Edit:

rec = results.fetchone()

>>> rec
('WithHHP16HinsHE0CCS109LHP', 'VAR_Cap', 'EVTRANS_H-L', 2014, 'FR', None, 296.071141357762)
#                                           python int  --^       python float --^

>>> type(rec)
sqlalchemy.engine.row.Row

Python相关问答推荐

不同数据类型的Python成员变量不会在具有相同优先级的不同线程中更新

手动为pandas中的列上色

尽管进程输出错误消息,subProcess.check_call的CalledProcess错误.stderr为无

使用Python OpenCV的文本检测分割

Polars Dataframe:如何按组删除交替行?

从DataFrame.apply创建DataFrame

Pandas 在最近的日期合并,考虑到破产

将jit与numpy linSpace函数一起使用时出错

如何将双框框列中的成对变成两个新列

运行Python脚本时,用作命令行参数的SON文本

C#使用程序从Python中执行Exec文件

如何过滤包含2个指定子字符串的收件箱列名?

形状弃用警告与组合多边形和多边形如何解决

无法在Docker内部运行Python的Matlab SDK模块,但本地没有问题

从嵌套的yaml创建一个嵌套字符串,后面跟着点

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突

在单次扫描中创建列表

以逻辑方式获取自己的pyproject.toml依赖项

如何创建引用列表并分配值的Systemrame列

python sklearn ValueError:使用序列设置数组元素