Python 使用pyodbc从SQL Server提取的数据行是一个;“不易损坏类型”;
我目前正在根据用户输入从MS SQL Server 2008查询数据。但是,当我试图使用descripe()函数获取五个数字的摘要时,出现了一个错误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
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提供的信息