python3常用的資料清洗方法(小結)
阿新 • • 發佈:2020-01-09
首先載入各種包:
import pandas as pd import numpy as np from collections import Counter from sklearn import preprocessing from matplotlib import pyplot as plt %matplotlib inline import seaborn as sns plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文字型設定-黑體 plt.rcParams['axes.unicode_minus'] = False # 解決儲存影象是負號'-'顯示為方塊的問題 sns.set(font='SimHei') # 解決Seaborn中文顯示問題
讀入資料:這裡資料是編造的
data=pd.read_excel('dummy.xlsx')
本案例的真實資料是這樣的:
對資料進行多方位的檢視:
實際情況中可能會有很多行,一般用head()看資料基本情況
data.head() #檢視長啥樣 data.shape #檢視資料的行列大小 data.describe()
#列級別的判斷,但凡某一列有null值或空的,則為真 data.isnull().any() #將列中為空或者null的個數統計出來,並將缺失值最多的排前 total = data.isnull().sum().sort_values(ascending=False) print(total) #輸出百分比: percent =(data.isnull().sum()/data.isnull().count()).sort_values(ascending=False) missing_data = pd.concat([total,percent],axis=1,keys=['Total','Percent']) missing_data.head(20)
也可以從視覺上直觀檢視缺失值:
import missingno missingno.matrix(data) data=data.dropna(thresh=data.shape[0]*0.5,axis=1) #至少有一半以上是非空的列篩選出來
#如果某一行全部都是na才刪除: data.dropna(axis=0,how='all')
#預設情況下是隻保留沒有空值的行 data=data.dropna(axis=0)
#統計重複記錄數 data.duplicated().sum() data.drop_duplicates()
對連續型資料和離散型資料分開處理:
data.columns #第一步,將整個data的連續型欄位和離散型欄位進行歸類 id_col=['姓名'] cat_col=['學歷','學校'] #這裡是離散型無序,如果有序,請參考map用法,一些部落格上有寫 cont_col=['成績','能力'] #這裡是數值型 print (data[cat_col]) #這裡是離散型的資料部分 print (data[cont_col])#這裡是連續性資料部分
對於離散型部分:
#計算出現的頻次 for i in cat_col: print (pd.Series(data[i]).value_counts()) plt.plot(data[i])
#對於離散型資料,對其獲取啞變數 dummies=pd.get_dummies(data[cat_col]) dummies
對於連續型部分:
#對於連續型資料的大概統計: data[cont_col].describe() #對於連續型資料,看偏度,一般大於0.75的數值做一個log轉化,使之儘量符合正態分佈,因為很多模型的假設資料是服從正態分佈的 skewed_feats = data[cont_col].apply(lambda x: (x.dropna()).skew() )#compute skewness skewed_feats = skewed_feats[skewed_feats > 0.75] skewed_feats = skewed_feats.index data[skewed_feats] = np.log1p(data[skewed_feats]) skewed_feats
#對於連續型資料,對其進行標準化 scaled=preprocessing.scale(data[cont_col]) scaled=pd.DataFrame(scaled,columns=cont_col) scaled
m=dummies.join(scaled) data_cleaned=data[id_col].join(m) data_cleaned
看變數之間的相關性:
data_cleaned.corr()
#以下是相關性的熱力圖,方便肉眼看 def corr_heat(df): dfData = abs(df.corr()) plt.subplots(figsize=(9,9)) # 設定畫面大小 sns.heatmap(dfData,annot=True,vmax=1,square=True,cmap="Blues") # plt.savefig('./BluesStateRelation.png') plt.show() corr_heat(data_cleaned)
如果有覺得相關性偏高的視情況刪減某些變數。
#取出與某個變數(這裡指能力)相關性最大的前四個,做出熱點圖表示 k = 4 #number of variables for heatmap cols = corrmat.nlargest(k,'能力')['能力'].index cm = np.corrcoef(data_cleaned[cols].values.T) sns.set(font_scale=1.25) hm = sns.heatmap(cm,cbar=True,fmt='.2f',annot_kws={'size': 10},yticklabels=cols.values,xticklabels=cols.values) plt.show()
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。