很多時候在數據分析之前,我們需要對樣本進行校驗,以確定樣本的價值。
先寫入數據:
import pandas as pd import numpy as np df = pd.DataFrame({'一班':[90,80,66,75,99,55,76,78,98,None,90], '二班':[75,98,100,None,77,45,None,66,56,80,57], '三班':[45,89,77,67,65,100,None,75,64,88,99]})
1完整性校驗
# 判斷是否為缺失值(空值) df.isnull()
# 統計出每一列的缺失值數目 df.isnull().sum()
# 每一列缺失比例 df.isnull().sum()/df.shape[0]
# 判斷非空值的數目 df.notnull().sum()
筆記:這里也可以用到describe方法,如下:
# 使用describe方法查看數據的完整性,統計出了非空值的數目 df.describe().iloc[0,:]
忘了describe方法的話,請查看《Python之Pandas知識點》
2時間跨度檢驗
很多樣本的時間數據並不是以datatime64類型存儲的,此時我們得先進行“數據類型修改”
詳見:《Python之Pandas知識點》的4.3數據修改
之后進行最大最小相減就OK了。
print(date.max()-date.min())
3重復檢驗
# 二班和四班是相同的 df1 = pd.DataFrame({'一班':[90,80,66,90,99,55,76,90,98,None,90], '二班':[75,98,100,75,77,45,None,75,56,80,57], '三班':[45,89,77,45,65,100,None,45,64,88,99], '四班':[75,98,100,75,77,45,None,75,56,80,57]})
3.1樣本重復檢驗(行)
DataFrame.drop_duplicates(subset=None, keep='first', inplace=False)
- subset:表示以這幾個特征為基礎,對整體樣本進行去重。默認為使用所有特征
- keep:表示保留第幾個重復的樣本。只允許填入first(保留第一個),last(保留最后一個),False(只要存在重復均不保留)。默認為first
- inplace:表示是否在原DataFrame上進行操作,會改變原數據。默認為False
# 刪除重復樣本(行) df1.drop_duplicates()
# 計算樣本重復率 (df1.shape[0] - df1.drop_duplicates().shape[0])/df1.shape[0]
3.2特征重復檢驗(列)
特征重復檢驗相比樣本重復檢驗要麻煩一點,因為沒有現成的函數可調用。
需要用到相似度的概念,如下:
- pearson相似度
- spearman相似度
- kendall相似度
# 使用pandas的方法:DataFrame.corr(method='pearson') asso = df1.corr()
# 輸出asso,看一下是怎樣的先 print(asso)
不難看出,這是一個對稱矩陣,所以我們只需要判斷右上半角的數據便可。
# 輸出應刪除的columns,1.0可根據需求改動 delCol = [] for i in range(len(asso)): for j in range(i+1,len(asso)): if asso.iloc[i,j] == 1.0: delCol.append(asso.columns[j]) print(delCol)
最后,附上一段 ♦特征重復檢驗♦ 的自定義代碼:
# 輸入DataFrame,輸出特征重復的列名,可直接復制調用 def drop_features(data,way = 'pearson',assoRate = 1.0): ''' 此函數用於求取相似度大於assoRate的兩列中的一個,主要目的用於去除數值型特征的重復 data:數據框,無默認 assoRate:相似度,默認為1 ''' assoMat = data.corr(method = way) delCol = [] length = len(assoMat) for i in range(length): for j in range(i+1,length): if asso.iloc[i,j] >= assoRate: delCol.append(assoMat.columns[j]) return(delCol)
效果如下:
drop_features(df1)
是不是超好用,巨方便~~~不謝