繼續之前的數據和工作,進行數據的標準化處理,具體數據可從下方博客鏈接獲取
剔除異常值
放下表一和表二Excel的截圖
大體思路:
實際問題中,不同數據可能有不同的性質和量綱,爲進行模糊聚類,需進行標準化處理。這裏採用極差變換:
放代碼:
import numpy as np
import pandas as pd
path = "E:/Model_building/A/"
s2 = pd.read_excel(path+"sheet2.xlsx")
s1 = pd.read_excel(path+"sheet1.xlsx") # 導入1、2表
s1 = pd.DataFrame(s1.values) # dataframe
s2 = pd.DataFrame(s2.values)
s1 = s1.drop([s1.columns[0]], axis=1) # 去掉0列
s2 = s2.drop([s2.columns[0]], axis=1)
s1.columns = ['a', 'b', 'c', 'd', 'e'] # 之前作死刪掉了列名,感覺還是用列名更方便
s2.columns = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
s2['1'] = s2['1'].astype('int64') # 輸出發現表2的序號列爲float,更改爲int
看一下s1和s2的頭部輸出,其中a,1都爲採樣點的序號,b,c爲xy座標,d爲海拔,e爲地區類型,2到9爲八種元素在每個採樣點的濃度
s12 = pd.merge(s1, s2, how='inner', left_on='a', right_on='1') # 將表1、2按照索引,合併爲s12
del s12['1']
s12.head()
看一下s12的頭部輸出 ,這樣就明瞭了
path = "E:/Model_building/A/"
ma = s12.groupby(s12['e']).max().iloc[:, 4:12]
mi = s12.groupby(s12['e']).min().iloc[:, 4:12] # 按照地區列分組,得出每種元素最大最小值
s122 = s12.set_index(['a','e']) # 雙重索引
print(mi,'\n')
print(s122.head())
s122.iloc[:, 3:12] = ( s122.iloc[:, 3:12] - mi )/(ma-mi) # 極差變換
s122.to_excel(path+"sheet_standardized.xlsx")
在進行極差變換時,由於s122和mi相減時,由於s122每種e有多個,所以一直報錯 ,如下:
不能有重複索引,所以設置一個雙重索引(即地區和序號),這樣在相減時,自動匹配對應的行(e)和列(元素)
pathx = "E:/Model_building/A/cumcm2011A附件_數據.xls"
p = s12.iloc[:,5:].groupby(s12['e']).mean() # 每個地區每種元素的均值
print(p)
s122 = s122.reset_index() # 取消索引,以便下一步引用‘e’
p1 = s122.groupby(s122['e']).mean().iloc[:, 5:] # 每個地區每種元素,經過極差變換後的均值
print(p1)
p1.to_excel(path+"sheet1-6.xlsx") # 保存
p.to_excel(path+"sheet1-7.xlsx")
放一下兩個表的結果