簡體   English   中英

熊貓read_sql函數產生二進制列名

[英]Pandas read_sql function produces binary column names

我可以訪問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')

我不記得以前有這個問題,也找不到在線類似問題的參考。 結果,我無法確定正在發生什么。

任何建議,將不勝感激。

編輯:根據喬里斯的評論,以下內容可能有用:

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)裝飾器(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)失調( 0.7.1)nbconvert(4.0.0)nbformat(4.0.1)鼻子(1.3.7)筆記本(4.0.6)numexpr(2.4.3)numpy(1.10.1)openpyxl(2.2.4)熊貓(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)六(1.9.0)總站(0.5)龍卷風(4.2.1)特質(4.0.0)xlrd(0.9.3)

在虛擬環境中

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

安裝的版本

提交:無python:3.4.1.final.0 python位:64 OS:達爾文OS版本:15.2.0機器:x86_64處理器:i386字節序:小LC_ALL:無LANG:en_GB.UTF-8

熊貓: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創建引擎無法連接,因為我無法將pyodbc安裝在運行El Capitan的Mac上(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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM