[英]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.