gpt4 book ai didi

python - Pandas read_sql 函数生成二进制列名

转载 作者:行者123 更新时间:2023-12-01 04:15:30 26 4
gpt4 key购买 nike

我可以访问 MS SQL SERVER 数据库,从中检索数据进行分析。我使用 Mac,因此可以使用 Navicat Essentials for SQL Server 访问数据库。这真的很好用。但是,我想使用 Python 访问数据库。我已经安装了 Python 3.4 的虚拟环境,并安装了各种库,包括 Numpy、Pandas、Pypyodbc 等。我在 ODBC 管理器应用程序中配置了 DNS 连接,并且可以使用 Python 访问数据库中名为“类别”的表,如下所示:

import pandas as pd
import pypyodbc

connectionName = pypyodbc.connect('DNS=myDNSName')

queryName 'SELECT ID, CategoryName FROM Category'

retrievedDataDF = pd.io.sql.read_sql(queryName, con=connectionName)

connectionName.close()

print(retrieveDataDF.head())
print(retrieveDataDF.columns)

这似乎工作正常,除了返回的数据帧中的列标题似乎以某种形式的二进制格式表示,在这种情况下,数据帧中的列标题是 b'i' 和 b'c'。打印函数的输出是:

   b'i'     b'c'
0 1 missing
1 2 blue
2 3 red
3 4 green
4 5 yellow

Index([b'i', b'c'], dtype='object')

我不记得以前遇到过这个问题,而且我在网上找不到任何类似问题的引用。结果,我无法弄清楚发生了什么。

如有任何建议,我们将不胜感激。

编辑:根据 Joris 的评论,以下内容可能有用:

connectionName.cursor().execute(queryName).description

[(b'i', int, 11, 10, 10, 0, False), (b'c', str, 100, 100, 100, 0, True)]

所有已安装库的版本如下:

从终端

$ env/bin/pip list

appnope (0.1.0) decorator (4.0.4) gnureadline (6.3.3) ipykernel (4.1.1) ipython (4.0.0) ipython-genutils (0.1.0) ipywidgets (4.1.1) jdcal (1.0) Jinja2 (2.8) jsonschema (2.5.1) jupyter (1.0.0) jupyter-client (4.1.1) jupyter-console (4.0.3) jupyter-core (4.0.6) MarkupSafe (0.23) matplotlib (1.4.3) mistune (0.7.1) nbconvert (4.0.0) nbformat (4.0.1) nose (1.3.7) notebook (4.0.6) numexpr (2.4.3) numpy (1.10.1) openpyxl (2.2.4) pandas (0.17.0) pandastable (0.4.0) path.py (8.1.2) pexpect (4.0.1) pickleshare (0.5) pip (1.5.6) ptyprocess (0.5) Pygments (2.0.2) pyparsing (2.0.3) pypyodbc (1.3.3) python-dateutil (2.4.2) pytz (2015.6) pyzmq (14.7.0) qtconsole (4.1.0) scipy (0.16.1) setuptools (3.6) simplegeneric (0.8.1) six (1.9.0) terminado (0.5) tornado (4.2.1) traitlets (4.0.0) xlrd (0.9.3)

来自虚拟环境

import pandas as pd
pd.show_versions(as_json=False)

INSTALLED VERSIONS

commit: None python: 3.4.1.final.0 python-bits: 64 OS: Darwin OS-release: 15.2.0 machine: x86_64 processor: i386 byteorder: little LC_ALL: None LANG: en_GB.UTF-8

pandas: 0.17.0 nose: 1.3.7 pip: 1.5.6 setuptools: 3.6 Cython: None numpy: 1.10.1 scipy: 0.16.1 statsmodels: None IPython: 4.0.0 sphinx: None patsy: None dateutil: 2.4.2 pytz: 2015.6 blosc: None bottleneck: None tables: None numexpr: 2.4.3 matplotlib: 1.4.3 openpyxl: 2.2.4 xlrd: 0.9.3 xlwt: None xlsxwriter: None lxml: None bs4: None html5lib: None httplib2: None apiclient: None sqlalchemy: None pymysql: None psycopg2: None

(从那时起,我已经安装了 sqlalchemy 1.0.10,但我仍在尝试使用 SQLAlchemy 进行连接。)

编辑2

使用 sqlalchemy 连接创建引擎失败,因为我无法在运行 El Capitan 的 Mac 上安装 pyodbc(pip 安装失败,由于缺少 sql.h 头文件而导致 fatal error )并且 sqlalchemy 似乎需要 pyodbc被安装。相反,我通常使用 pypyodbc,但 sqlalchemy 不能使用 pypyodbc 代替 pyodbc。但是,我已使用以下命令成功连接到数据库:

phjConnection = pypyodbc.connect(driver="{Actual SQL Server}",server="myServerName",uid="myUserName",pwd="myPassword",db="myDBName",port="1433")
phjQuery = '''SELECT ID, Catagory_Name FROM Catagory'''
phjLatestData = pd.io.sql.read_sql(phjQuery, con=phjConnection)

不确定这是否达到了 Joris 建议的相同目标,但问题仍然存在,即:

print(phjLatestData.head())

b'i' b'c'
0 1 missing
1 2 blue
2 3 red
3 4 green
4 5 yellow

最佳答案

这似乎是 pypyodbc 驱动程序本身的问题。 Pandas 根据从查询结果中获取的信息(尤其是其 description 属性)构造结果数据帧的列名称。
如果您手动运行此命令,您将得到(从您的编辑中复制):

>>> connectionName.cursor().execute(queryName).description
[(b'i', int, 11, 10, 10, 0, False), (b'c', str, 100, 100, 100, 0, True)]

通常,每个元组中的第一个值应该是列名称。但在这里,它只为您提供第一个字符作为字节。
对于某些环境(我认为特别是 Python 3)来说,这似乎是一个已知问题,至少已经被报告过: https://code.google.com/p/pypyodbc/issues/detail?id=43

关于python - Pandas read_sql 函数生成二进制列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34353606/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com