Pandas read_sql函数生成二进制列名

时间:2015-12-18 10:35:11

标签: python sql python-3.x pandas dataframe

我可以访问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)   龙卷风(4.2.1)traitlets(4.0.0)xlrd(0.9.3)

来自虚拟环境

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

安装版本

     

commit:无python:3.4.1.final.0 python-bits:64 OS:Darwin   操作系统发布:15.2.0机器:x86_64处理器:i386字节顺序:很少   LC_ALL:无LANG:en_GB.UTF-8

     

pandas:0.17.0鼻子:1.3.7点子:1.5.6 setuptools:3.6 Cython:无   numpy:1.10.1 scipy:0.16.1 statsmodels:无IPython:4.0.0 sphinx:   无patsy:无dateutil:2.4.2 pytz:2015.6 blosc:无瓶颈:   无表格:无numexpr:2.4.3 matplotlib:1.4.3 openpyxl:2.2.4   xlrd:0.9.3 xlwt:无xlsxwriter:无lxml:无bs4:无html5lib:   无httplib2:无apiclient:无sqlalchemy:无pymysql:无   psycopg2:无

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

编辑2

无法使用sqlalchemy连接创建引擎,因为我无法在运行El Capitan的Mac上安装pyodbc(pip安装失败,因为缺少sql.h头文件而导致致命错误)并且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

1 个答案:

答案 0 :(得分:2)

这似乎是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