使用pyodbc从SQL Server中提取的数据行是"不可用类型"

grl*_*aer 3 python numpy pyodbc pandas

我目前正在根据用户输入查询来自MS SQL Server 2008的数据.但是,当我尝试使用describe()函数获取五个数字摘要时,我收到错误.

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()
Run Code Online (Sandbox Code Playgroud)

我的数据框看起来像这样

       rate
0      [0.25]
1      [0.67]
2      [0.93]
...       ...
1474   [5400.00]
Run Code Online (Sandbox Code Playgroud)

我得到以下返回和错误:

[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'
Run Code Online (Sandbox Code Playgroud)

我知道我需要将数据框中的数据转换为其当前对象的不同类型,但不确定如何转换为浮点数.

任何帮助表示赞赏

Bry*_*yan 5

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

>>> import pandas
>>> pandas.__version__
'0.14.1'
Run Code Online (Sandbox Code Playgroud)

使用pandas.read_sql_query直接填充数据,传递查询字符串和pyodbc连接.请注意,列别名rate已添加到T-SQL查询中,因为pandas.read_sql_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
Run Code Online (Sandbox Code Playgroud)

可以使用params参数of 来提供原始查询中的参数值pandas.read_sql_query.