Python 使用pyodbc从SQL Server提取的数据行是一个;“不易损坏类型”;

Python 使用pyodbc从SQL Server提取的数据行是一个;“不易损坏类型”;,python,numpy,pandas,pyodbc,Python,Numpy,Pandas,Pyodbc,我目前正在根据用户输入从MS SQL Server 2008查询数据。但是,当我试图使用descripe()函数获取五个数字的摘要时,出现了一个错误 import pyodbc import numpy as np import pandas.io.sql as sql import pandas print "What Part Number will you examine?" PartN = raw_input() conn = pyodbc.connect('my connectio

我目前正在根据用户输入从MS SQL Server 2008查询数据。但是,当我试图使用descripe()函数获取五个数字的摘要时,出现了一个错误

import pyodbc
import numpy as np
import pandas.io.sql as sql
import pandas

print "What Part Number will you examine?"
PartN = raw_input()

conn = pyodbc.connect('my connection info')
curs = conn.cursor()
sqlr = """SELECT partmadeperhour FROM Completions WHERE  PartNumber = ?  
AND endtime > '2012-12-31 23:59:00' ORDER BY partmadeperhour"""


q = curs.execute(sqlr,[PartN]).fetchall()

df = pandas.DataFrame(q, columns =['rate'])
print df



columnnames = list(df.columns.values)
print columnnames

df['rate'].describe()
我的数据框看起来像这样

       rate
0      [0.25]
1      [0.67]
2      [0.93]
...       ...
1474   [5400.00]
我得到以下返回和错误:

[1475 rows x 1 columns]
['rate']
rate    object
dtype: object
Traceback (most recent call last):

File "newr.py", line 30, in <module>
    df['rate'].describe()

 File "C:\Python27\lib\site-packages\pandas\core\generic.py", line 4034, in describe
return describe_1d(self, percentiles)

  File "C:\Python27\lib\site-packages\pandas\core\generic.py", line 4031, in describe_1d
return describe_categorical_1d(data)

    File "C:\Python27\lib\site-packages\pandas\core\generic.py", 
line 4007, in describe_categorical_1d
objcounts = data.value_counts()

  File "C:\Python27\lib\site-packages\pandas\core\base.py", line 433, in value_counts
normalize=normalize, bins=bins, dropna=dropna)

 File "C:\Python27\lib\site-packages\pandas\core\algorithms.py", line 245, in value_counts
keys, counts = htable.value_count_object(values, mask)

 File "pandas\hashtable.pyx", line 983, in pandas.hashtable.value_count_object 
(pandas\hashtable.c:17616)

 File "pandas\hashtable.pyx", line 994, in pandas.hashtable.value_count_object 
(pandas\hashtable.c:17353)
TypeError: unhashable type: 'pyodbc.Row'
[1475行x 1列]
[“费率”]
费率对象
数据类型:对象
回溯(最近一次呼叫最后一次):
文件“newr.py”,第30行,在
df['rate'].描述()
文件“C:\Python27\lib\site packages\pandas\core\generic.py”,第4034行,在描述中
返回描述1d(自我,百分位数)
文件“C:\Python27\lib\site packages\pandas\core\generic.py”,第4031行,在description\u 1d中
返回描述\u分类\u 1d(数据)
文件“C:\Python27\lib\site packages\pandas\core\generic.py”,
第4007行,描述分类
objcounts=data.value_counts()
文件“C:\Python27\lib\site packages\pandas\core\base.py”,第433行,以值为单位
正常化=正常化,存储箱=存储箱,dropna=dropna)
文件“C:\Python27\lib\site packages\pandas\core\algorithms.py”,第245行,以值为单位
键,计数=htable.value\u count\u对象(值,掩码)
pandas.hashtable.value\u count\u对象中的文件“pandas\hashtable.pyx”,第983行
(熊猫\hashtable.c:17616)
pandas.hashtable.value\u count\u对象中第994行的文件“pandas\hashtable.pyx”
(熊猫\hashtable.c:17353)
TypeError:不可损坏的类型:“pyodbc.Row”
我知道我需要将dataframe中的数据转换为不同的类型,因为它当前是一个对象,但不确定如何转换为浮点

感谢您的任何帮助

而非此

q = curs.execute(sqlr,[PartN]).fetchall()
df = pandas.DataFrame(q, columns =['rate'])
你能试试吗

df = sql.read_frame(sqlr, conn) # You can directly read a table as dataframe

确保您使用的是pandas 0.12或更高版本:

>>> import pandas
>>> pandas.__version__
'0.14.1'
用于直接填充数据框,传递查询字符串和pyodbc连接。请注意,列别名
rate
已添加到T-SQL查询中,因为
panda.read\u SQL\u query
不支持传递列名列表或字典:

...
>>> sql = "select 0.25 union select 0.67 union select 0.93 as rate" 
>>> df = pandas.read_sql_query(sql, connection)
>>> df
   rate
0  0.25
1  0.67
2  0.93
>>> df['rate'].describe()
count    3.000000
mean     0.616667
std      0.343123
min      0.250000
25%      0.460000
50%      0.670000
75%      0.800000
max      0.930000
dtype: float64

原始查询中的参数值可以使用
pandas的
params
参数提供。read\u sql\u query

使用pandas是否正确。read\u sql\u query我需要使用SQLAlchemy代替pyodbc?不,不需要SQLAlchemy。与DBAPI兼容的pyodbc连接工作正常。谢谢,您的解决方案比我预期的要简单得多。请注意,
read\u frame
已被弃用,请改用
pd.read\u sql
pd.read\u sql\u query
。感谢@Joris提供的信息