[Python]关于‘DataFrame’对象没有‘sort’属性
最近在阅读《Python数据分析与挖掘实战》一书,其中发现不少内容没有更新,导致提供的代码直接运行会出现错误。
下面是第8章《中医证型关联规则挖掘》的 “代码清单8-1 数据聚类离散化代码 ” :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 from __future__ import print_functionimport pandas as pdfrom sklearn.cluster import KMeansdatafile = '../data/data.xls' processedfile = '../tmp/data_processed.xls' typelabel = {u'肝气郁结证型系数' :'A' , u'热毒蕴结证型系数' :'B' , u'冲任失调证型系数' :'C' , u'气血两虚证型系数' :'D' , u'脾胃虚弱证型系数' :'E' , u'肝肾阴虚证型系数' :'F' } k = 4 data = pd.read_excel(datafile) keys = list (typelabel.keys()) result = pd.DataFrame() if __name__ == '__main__' : for i in range (len (keys)): print (u'正在进行“%s”的聚类...' % keys[i]) kmodel = KMeans(n_clusters=k, n_jobs=4 ) kmodel.fit(data[[keys[i]]].as_matrix()) r1 = pd.DataFrame(kmodel.cluster_centers_, columns=[typelabel[keys[i]]]) r2 = pd.Series(kmodel.labels_).value_counts() r2 = pd.DataFrame(r2, columns=[typelabel[keys[i]] + 'n' ]) r = pd.concat([r1, r2], axis=1 ).sort(typelabel[keys[i]]) r.index = [1 ,2 ,3 ,4 ] r[typelabel[keys[i]]] = pd.rolling_mean(r[typelabel[keys[i]]], 2 ) r[typelabel[keys[i]]][1 ] = 0.0 result = result.append(r.T) result = result.sort() result.to_excel(processedfile)
其中,第25、31行中会出现 ‘DataFrame’ object has no attribute ‘sort’ 错误,第27行会出现 module ‘pandas’ has no attribute ‘rolling_mean’ 的错误。
关于 ‘DataFrame’ object has no attribute ‘sort’ sort 已经弃用,代替使用的是 sort_values
或者 sort_index
。
sort_values 基本用法:
根据“col1”排序:df.sort_values(by=['col1'])
根据多个排序:df.sort_values(by=['col1', 'col2'])
倒叙排序(省略为默认正序):df.sort_values(by='col1', ascending=False)
缺省值NaNs显示在前(省略默认在后):`df.sort_values(by='col1', ascending=False, na_position='first')`
注意:只有by是必须的,其他可缺省。
sort_index 基本用法:
直接使用,不需要添加参数:df.sort_index()
关于 module ‘pandas’ has no attribute ‘rolling_mean’ pandas包中关于“rolling_mean”已经更新用法,代替使用的是 rolling
。
“rolling_mean” 的用法应该对应为df.rolling(2).mean()
。
修改版代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 from __future__ import print_functionimport pandas as pdfrom sklearn.cluster import KMeansdatafile = '../data/data.xls' processedfile = '../tmp/data_processed.xls' typelabel = {u'肝气郁结证型系数' :'A' , u'热毒蕴结证型系数' :'B' , u'冲任失调证型系数' :'C' , u'气血两虚证型系数' :'D' , u'脾胃虚弱证型系数' :'E' , u'肝肾阴虚证型系数' :'F' } k = 4 data = pd.read_excel(datafile) keys = list (typelabel.keys()) result = pd.DataFrame() if __name__ == '__main__' : for i in range (len (keys)): print (u'正在进行“%s”的聚类...' % keys[i]) kmodel = KMeans(n_clusters=k, n_jobs=4 ) kmodel.fit(data[[keys[i]]].as_matrix()) r1 = pd.DataFrame(kmodel.cluster_centers_, columns=[typelabel[keys[i]]]) r2 = pd.Series(kmodel.labels_).value_counts() r2 = pd.DataFrame(r2, columns=[typelabel[keys[i]] + 'n' ]) r = pd.concat([r1, r2], axis=1 ).sort_values(typelabel[keys[i]]) r.index = [1 ,2 ,3 ,4 ] r[typelabel[keys[i]]] = r[typelabel[keys[i]]].rolling(2 ).mean() r[typelabel[keys[i]]][1 ] = 0.0 result = result.append(r.T) result = result.sort_index() result.to_excel(processedfile)