一、了解缺失值
- 通常使用 NA('not available')來代指缺失值
- 在Pandas的數據結構中,缺失值使用 NaN('Not a Number')進行標識
除了匯總統計方法,還可以使用isnull()來對數據中缺失的樣本占比、特征大致的缺失情況進行了解。
>>> df =pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), ... 'two':pd.Series([1,3,2,7],index=['a','b','c','d']), ... 'three':pd.Series([3,8,3],index=['d','a','c'])}) >>> df one two three a 1.0 1 8.0 b 2.0 3 NaN c 3.0 2 3.0 d NaN 7 3.0 #缺失值的數量分析 >>> df.isnull() one two three a False False False b False False True c False False False d True False False >>> df.isnull().sum() one 1 two 0 three 1 dtype: int64
二、缺失值填充---fillna()
使用fillna()方法進行缺失值填補
填充方式分為以下幾種:
(1)使用同一個值填補所有的缺失值
>>> df.fillna('用我填充') one two three a 1 1 8 b 2 3 用我填充 c 3 2 3 d 用我填充 7 3
(2)向前填充、向后填充--->通過設置參數method參數來實現
method參數 | 說明 |
ffill或pad | 向前填充值 |
bfill或backfill | 向后填充值 |
#向前填充 >>> df.fillna(method='pad') one two three a 1.0 1 8.0 b 2.0 3 8.0 c 3.0 2 3.0 d 3.0 7 3.0 #向后填充 >>> df.fillna(method='bfill') one two three a 1.0 1 8.0 b 2.0 3 3.0 c 3.0 2 3.0 d NaN 7 3.0
(3)對不同列的缺失值使用不同的值進行填補
可以使用字典的方式,如下:
>>> df.fillna({'one':1,'three':3}) one two three a 1.0 1 8.0 b 2.0 3 3.0 c 3.0 2 3.0 d 1.0 7 3
(4)使用一個Pandas的自動對齊功能進行填補
這也是最常使用的一種方式
>>> df.fillna(df.mean()) one two three a 1.0 1 8.000000 b 2.0 3 4.666667 c 3.0 2 3.000000 d 2.0 7 3.000000
三、丟棄數據
在一些實際的應用場景中,需要根據某些過濾條件丟棄部分無用數據,在多數情況下數據過濾可以同時達到獲取和丟棄數據的目的。
除了使用布爾表達式之外,Pandas對象還有以下三種方法來丟棄無用數據:
- drop():根據標簽丟棄數據
- drop_duplicates():丟棄重復數據
- dropna():丟失缺失數據
(1)根據標簽丟棄數據----drop()
drop()可以根據標簽丟棄多行或多了數據,基本參數如下:
labels:單個或者多個標簽,傳入類列表值(列表、array等)
axis:丟棄行(0,默認)或者列(1)
inplace:是否用結果替換原pandas對象(默認False)
#仍然以上述的df為例 >>> df one two three a 1.0 1 8.0 b 2.0 3 NaN c 3.0 2 3.0 d NaN 7 3.0 >>> df.drop(['d','c']) one two three a 1.0 1 8.0 b 2.0 3 NaN >>> df.drop(labels=['d','c']) one two three a 1.0 1 8.0 b 2.0 3 NaN >>> df.drop(labels=['three'],axis=1) one two a 1.0 1 b 2.0 3 c 3.0 2 d NaN 7
(2)丟棄重復數據----drop_duplicates()
1)由於不同的原因,數據中可能會包含重復出現的行(記錄),重復的記錄會造成信息的冗余,但是在實際中丟棄重復數據需要謹慎,盲目去重可以會造成數據集丟失部分數據。
duplicated()方法可以返回一個布爾型的Series,表示各行是否重復,僅僅將重復的最后一行標記為True;
注:duplicated()方法有參數keep,keep的值有一下三種情況:
keep = 'first'---->返回結果中的第一個重復的數據
keep = 'last'----->返回結果中的最后一個重復的數據
keep = False------>所有的重復數據為True
#先創建一個new_df,與df中有重復的記錄 >>> new =pd.DataFrame({'one':pd.Series([1,3],index=['e','f']),'two':pd.Series([1,2],index=['e','f']),'three':pd.Series([8,3],index=['e','f'])}) >>> new one two three e 1 1 8 f 3 2 3 >>> new_df = pd.concat([df,new]) >>> new_df one two three a 1.0 1 8.0 b 2.0 3 NaN c 3.0 2 3.0 d NaN 7 3.0 e 1.0 1 8.0 f 3.0 2 3.0 #查看各行是否重復 >>> new_df.duplicated() a False b False c False d False e True f True dtype: bool #通過布爾過濾可以丟棄重復數據 >>> new_df[new_df.duplicated()==False] one two three a 1.0 1 8.0 b 2.0 3 NaN c 3.0 2 3.0 d NaN 7 3.0 >>> new_df.duplicated(keep='first') a False b False c False d False e True f True dtype: bool >>> new_df.duplicated(keep=False) a True b False c True d False e True f True dtype: bool
2)Pandas提供的drop_duplicates()可以更加簡便的完成去重操作,默認情況下會判斷全部列,若只希望根據某一列判斷重復項,則在括號后加入列即可。
>>> new_df.drop_duplicates() one two three a 1.0 1 8.0 b 2.0 3 NaN c 3.0 2 3.0 d NaN 7 3.0 >>> new_df.drop_duplicates('three') one two three a 1.0 1 8.0 b 2.0 3 NaN c 3.0 2 3.0 >>> new_df.drop_duplicates(['one','three']) one two three a 1.0 1 8.0 b 2.0 3 NaN c 3.0 2 3.0 d NaN 7 3.0
(3)丟棄缺失值數據----dropna()
在含有缺失值樣本比例較小的情況下,可以考慮丟棄缺失值所在的行,或者說一個特征大部分都是缺失值是,也可以考慮丟棄該特征。
dropna()方法用於丟棄缺失值相關數據,其常用的參數如下:
axis:丟棄缺失值所在的行(0,默認)或所在列(1);
how:'any'表示只要存在缺失值就丟棄(默認),'all'表示所有的值均為缺失值才丟棄;
subset:考慮部分行和列
inplace:是否替換原來的Pandas對象
#仍以df為例,此時若要刪除存在缺失值所在的行,則 >>> df.dropna(how='any') one two three a 1.0 1 8.0 c 3.0 2 3.0 #若刪除three列,則 >>> df.drop(columns='three',inplace=True) >>> df one two a 1.0 1 b 2.0 3 c 3.0 2 d NaN 7