原文連接:https://www.cnblogs.com/tecdat/p/9430901.htmlhtml
缺失值處理spa
真實數據每每某些變量會有缺失值。htm
首先,咱們用 info( ) 語句操做,看到整份數據的大概狀況:對象
titanic_df.info()blog
從這份數據咱們能夠發現,這裏一共有 891 行數據,因此在中間那一列數據中看到的不是 891 個數據的,都是有缺失值的。好比年齡Age這一列,有714個非空數值,就有 891-714=177 個缺失值。又好比船艙號碼 cabin,缺失值就更多了。登船碼頭的缺失值比較少,後面能夠不用處理。索引
這些缺失值是怎麼處理的呢?通常是三種處理方法:不處理/丟棄/填充。rem
這裏,cabin有超過70%以上的缺失值,咱們能夠考慮直接丟掉這個變量。 -- 刪除某一列數據get
像Age這樣的重要變量,有20%左右的缺失值,咱們能夠考慮用中位值來填補。-- 填補缺失值it
咱們通常不提倡去掉帶有缺失值的行,由於其餘非缺失的變量可能提供有用的信息。-- 刪除帶缺失值的行class
刪除帶缺失值的行(通常不建議):df.dropna( )刪除某一列:df.drop('column_name', axis=1, inplace=True)
填充缺失值:df.column_name.fillna( )
axis=1,表明刪除的是一列的數據,也就是 column_name 這一列。inplace=True,表示在 df 這個原始數據上面進行修改。
其實咱們這節課重點的是最後一個:填充缺失值。fill 是填充,na 是缺失值的代稱。
咱們在 info( ) 這個運行中能夠看到 Age 的缺失值很多,下面將使用中位數來填充 缺失值。
填補年齡數據中的缺失值
直接使用全部人年齡的中位數來填補
爲了方便後面的比較,咱們首先用 describe 統計數據。
查看Age列的統計值
這份數據照樣是能夠看到,非缺失值 count 是有 714,平均值 mean 是 29.6歲,標準差 std 是 14.5,這時能夠注意一下 50% 那個數據:28。
中位數
爲了防止數據有改動,咱們在開始以前須要從新載入數據。
正確的中位數可使用 median 的方法獲取,獲得的數和上面的 50% 的數是同樣的。
填充年齡缺失值
把中位數賦值給 age_median1,這個操做體如今第二行代碼。個人理解是,要是這裏不從新賦值的話,後面須要用到這個中位數的時候,就須要完整碼出 titanic_df.Age.median( ) 這一句,從新賦值就能夠直接使用 age_median1 來代替稍微長一點的句子了。
titanic_df.Age.fillna(age_median1,inplace=True) 中,由於使用到Age這列數據,而後用 fillna 來實現填充,因此語句用 titanic_df.Age.fillna( ) 來表達,括號裏面須要填的參數就是須要填充的值,也就是裏面的缺失值都是由剛剛賦值的 age_median1 來代替。逗號後面再加上inplace=True,表示在原來的 df 數據中進行修改了,若是不加上這個參數,就須要把填充後的值從新賦值給 Age 這一列,因此 inplace 這個動做是爲了簡單起見。
再來看咱們獲得的結果,這個時候的非空缺失值已經變成了891,平均值也從本來的29.7降到了29.4,由於咱們剛剛填充的中位數是28,比原來的平均值小,因此會有所新的平均值也會有所降低。
上面講的是全部人的年齡中位數,如今咱們進一步來思考:性別因素,會怎麼影響結果呢?
考慮性別因素,分別用男女乘客各自年齡的中位數來填補
因爲上面的操做已經對原始數據進行修改了,因此要是咱們須要從新分類,那就要從新載入原始數據,否則後面的操做都會以上一步填充了全部年齡缺失值的基礎上操做的哦!這個虧我吃過。。。
性別的中位數
咱們獲得的女性中位數是 27,男性的是 29,仍是有差距的吧!咱們後面須要用到的是,用得出的中位數來填充男女的缺失值。
接下來的步驟,按照之前,一般的思路是用布爾型索引取到女性中缺失值的數據,而後用 27 從新賦值;同理可求男性的操做。
可是咱們這節課學了fillna 這個新的方法啊!
不過剛剛咱們使用 fillna 的時候,填充的只是一個數值,這裏不止一個數值,就須要根據不一樣的狀況來填充。此時能夠用到 Pandas 中裏的一個小技巧,Pandas 的值在運算的過程當中,會根據索引的值來進行自動的匹配。在這裏咱們能夠看到這裏的索引是 female 和 male 兩個值,若是原始數據也能夠用性別來進行索引的話,就能夠用 fillna 自動匹配相應的索引形式進行填充了。
fillna 進行性別分類索引
因此這裏要對原來的數值從新設置索引,一開始是 0 1 2 這樣的數值,如今要把它設置成性別這一列數據。用 set_index 語句,用 Sex 來進行索引,同時加入參數 inplace=True,表示在原來的數據上進行修改。
inplace=True的含義應該講了第三遍了,其實我以爲要是否是很明白這個語句的用法時,你能夠先不加上這一句,跟着打代碼,而後到後面運行的哪一步你發現和老師的代碼不同的時候,你就知道這個語句的重要性了。
咱們能夠看到這裏的運行結果 列索引變成了 Sex,列首索引是 male 和 female ,在行首 Sex 已經不存在了。
填充性別分類的缺失值
咱們將這裏分類中位數賦值爲 age_median2。填充的套路和上面也是同樣同樣的,根據 Pandas 的自動匹配,填充的時候會根據索引來匹配不一樣的值了。由於後續須要用到 Sex 這一列,因此這裏也須要重置索引,將索引變成它的列。這裏使用 reset_index。
非空值是 891 時就說明缺失值所有填充完畢了,這時候的均值是29.4。
因此到這裏,咱們把性別分類的缺失值也用各自的中位數填充完畢了。下一步要考慮的是,同時兩個因素的影響:
同時考慮性別和艙位因素
那咱們首先來看一下,在不一樣年齡和不一樣艙位的中位數,有什麼變化呢?
groupby 分組的對象分別是 Pclass 艙位 和 Sex 性別,因爲這裏須要考量的有兩個因素:性別和艙位,因此這裏須要使用到中括號,後面加上用 Age.median 就能夠獲得分組的中位數了。
不一樣艙位男女年齡的中位數
這裏就有兩個索引,分別是艙位和性別,咱們能夠看到,隨着艙位的降低,它的年齡也是在降低的。用咱們的話理解就是,年輕人廣泛比年長的窮啊,年齡大一點的人積累的財富也多一點。
那接下來咱們就用得出的中位數來各自從新賦值給艙位和性別。這時仍是能夠用 fillna 的,可是須要設置二重索引。
艙位和年齡的分類
套路仍是同樣的,把這裏得出的中位數賦值爲 age_median3,而後對索引進行從新的賦值,一樣的,這裏有兩個因素,也是使用中括號,用 set_index 的方法。
而後來看一下重置索引後的數據。看輸出咱們是能夠看到二重索引的,第一列的組合內容一共有 3*2=6 種狀況。在列上面,已經沒有 Pclass 和 Sex 兩列數據了,由於此刻它們已經在索引上了。
如今按一樣的方法 fillna ,用索引值來匹配不一樣的中位數。
額。。。這兩張看起來和上面的一毛同樣啊,是我哪裏錯了嗎。。。?
爲了還原這樣的索引,這裏用 reset來重置
分類填充結果
這裏的輸出能夠看到非空數值已是891了,表示已經填滿缺失值了。平均值降低到了29.1歲,由於三等艙的人數比較多,並且年齡比較小,因此拉低了平均值。
咱們總結一下,這裏使用的 fillna 的方法,能夠對整體的中位數進行操做,或者分類以後對中位數進行操做。分組以後因爲有索引,因此同時也須要對原始數據進行索引,對於相同索引值,能夠用匹配來進行填充。