自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

手把手教你用pandas處理缺失值

大數(shù)據(jù) 數(shù)據(jù)分析
在進(jìn)行數(shù)據(jù)分析和建模的過程中,大量的時(shí)間花在數(shù)據(jù)準(zhǔn)備上:加載、清理、轉(zhuǎn)換和重新排列。本文將討論用于缺失值處理的工具。

[[381102]]

 pandas對(duì)象的所有描述性統(tǒng)計(jì)信息默認(rèn)情況下是排除缺失值的。

pandas對(duì)象中表現(xiàn)缺失值的方式并不完美,但是它對(duì)大部分用戶來說是有用的。對(duì)于數(shù)值型數(shù)據(jù),pandas使用浮點(diǎn)值NaN(Not a Number來表示缺失值)。我們稱NaN為容易檢測(cè)到的標(biāo)識(shí)值:

In :  

  1. string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado']) 
  1. string_data 

Out: 

  1. 0      aardvark  
  2. 1     artichoke  
  3. 2            NaN  
  4. 3       avocado  
  5. dtype: object 

In: 

  1. string_data.isnull() 

Out: 

  1. 0     False  
  2. 1     False  
  3. 2      True  
  4. 3     False  
  5. dtype: bool 

在pandas中,我們采用了R語言中的編程慣例,將缺失值成為NA,意思是not available(不可用)。在統(tǒng)計(jì)學(xué)應(yīng)用中,NA數(shù)據(jù)可以是不存在的數(shù)據(jù)或者是存在但不可觀察的數(shù)據(jù)(例如在數(shù)據(jù)收集過程中出現(xiàn)了問題)。當(dāng)清洗數(shù)據(jù)用于分析時(shí),對(duì)缺失數(shù)據(jù)本身進(jìn)行分析以確定數(shù)據(jù)收集問題或數(shù)據(jù)丟失導(dǎo)致的數(shù)據(jù)偏差通常很重要。

Python內(nèi)建的None值在對(duì)象數(shù)組中也被當(dāng)作NA處理:

In: 

  1. string_data[0] = None 
  1. string_data.isnull() 

Out: 

  1. 0      True  
  2. 1     False  
  3. 2      True  
  4. 3     False  
  5. dtype: bool 

pandas項(xiàng)目持續(xù)改善處理缺失值的內(nèi)部細(xì)節(jié),但是用戶API函數(shù),比如pandas. isnull,抽象掉了很多令人厭煩的細(xì)節(jié)。處理缺失值的相關(guān)函數(shù)列表如下:

  •  dropna:根據(jù)每個(gè)標(biāo)簽的值是否是缺失數(shù)據(jù)來篩選軸標(biāo)簽,并根據(jù)允許丟失的數(shù)據(jù)量來確定閾值
  •  fillna:用某些值填充缺失的數(shù)據(jù)或使用插值方法(如“ffill”或“bfill”)。
  •  isnull:返回表明哪些值是缺失值的布爾值
  •  notnull:isnull的反作用函數(shù)

01 過濾缺失值

有多種過濾缺失值的方法。雖然你可以使用pandas.isnull和布爾值索引手動(dòng)地過濾缺失值,但dropna在過濾缺失值時(shí)是非常有用的。在Series上使用dropna,它會(huì)返回Series中所有的非空數(shù)據(jù)及其索引值:

In: 

  1. from numpy import nan as NA  
  1. data = pd.Series([1, NA, 3.5, NA, 7]) 
  1. data.dropna() 

Out: 

  1. 0     1.0  
  2. 2     3.5  
  3. 4     7.0  
  4. dtype: float64 

上面的例子與下面的代碼是等價(jià)的:

In: 

  1. data[data.notnull()] 

Out: 

  1. 0     1.0  
  2. 2     3.5  
  3. 4     7.0  
  4. dtype: float64 

當(dāng)處理DataFrame對(duì)象時(shí),事情會(huì)稍微更復(fù)雜一點(diǎn)。你可能想要?jiǎng)h除全部為NA或包含有NA的行或列。dropna默認(rèn)情況下會(huì)刪除包含缺失值的行:

In: 

  1. data = pd.DataFrame([[1., 6.5, 3.], [1., NA, NA]  
  2.                      [NA, NA, NA], [NA, 6.5, 3.]])  
  1. cleaned = data.dropna()  
  1. data 

Out: 

  1.    0     1     2  
  2. 0  1.0  6.5  3.0  
  3. 1  1.0  NaN  NaN  
  4. 2  NaN  NaN  NaN  
  5. 3  NaN  6.5  3.0 

In: 

  1. cleaned 

Out: 

  1. 0     1     2  
  2.  1.0  6.5  3.0 

傳入how='all’時(shí),將刪除所有值均為NA的行:

In: 

  1. data.dropna(how='all'

Out: 

  1.      0    1    2  
  2. 0  1.0  6.5  3.0  
  3. 1  1.0  NaN  NaN  
  4. 3  NaN  6.5  3.0 

如果要用同樣的方式去刪除列,傳入?yún)?shù)axis=1:

In: 

  1. data[4] = NA  
  1. data 

Out: 

  1.      0    1    2   4  
  2. 0  1.0  6.5  3.0 NaN  
  3. 1  1.0  NaN  NaN NaN  
  4. 2  NaN  NaN  NaN NaN  
  5. 3  NaN  6.5  3.0 NaN 

In: 

  1. data.dropna(axis=1how='all'

Out: 

  1.      0    1    2  
  2. 0  1.0  6.5  3.0  
  3. 1  1.0  NaN  NaN  
  4. 2  NaN  NaN  NaN  
  5. 3  NaN  6.5  3.0 

過濾DataFrame的行的相關(guān)方法往往涉及時(shí)間序列數(shù)據(jù)。假設(shè)你只想保留包含一定數(shù)量的觀察值的行。你可以用thresh參數(shù)來表示:

In: 

  1. df = pd.DataFrame(np.random.randn(7, 3))  
  1. df.iloc[:4, 1] = NA  
  1. df.iloc[:2, 2] = NA  
  1. df 

Out: 

  1.           0         1         2  
  2. 0 -0.204708       NaN       NaN  
  3. 1 -0.555730       NaN       NaN  
  4. 2  0.092908       NaN  0.769023  
  5. 3  1.246435       NaN -1.296221  
  6. 4  0.274992  0.228913  1.352917  
  7. 5  0.886429 -2.001637 -0.371843  
  8. 6  1.669025 -0.438570 -0.539741 

In: 

  1. df.dropna() 

Out: 

  1.          0         1         2  
  2. 4 0.274992  0.228913  1.352917  
  3. 5 0.886429 -2.001637 -0.371843  
  4. 6 1.669025 -0.438570 -0.539741 

In: 

  1. df.dropna(thresh=2

Out: 

  1.          0         1         2  
  2. 2 0.092908       NaN  0.769023  
  3. 3 1.246435       NaN -1.296221  
  4. 4 0.274992  0.228913  1.352917  
  5. 5 0.886429 -2.001637 -0.371843  
  6. 6 1.669025 -0.438570 -0.539741 

02 補(bǔ)全缺失值

你有時(shí)可能需要以多種方式補(bǔ)全“漏洞”,而不是過濾缺失值(也可能丟棄其他數(shù)據(jù))。

大多數(shù)情況下,主要使用fillna方法來補(bǔ)全缺失值。調(diào)用fillna時(shí),可以使用一個(gè)常數(shù)來替代缺失值:

In: 

  1. df.fillna(0) 

Out: 

  1.           0         1         2  
  2. 0 -0.204708  0.000000  0.000000  
  3. 1 -0.555730  0.000000  0.000000  
  4. 2  0.092908  0.000000  0.769023  
  5. 3  1.246435  0.000000 -1.296221  
  6. 4  0.274992  0.228913  1.352917  
  7. 5  0.886429 -2.001637 -0.371843  
  8. 6  1.669025 -0.438570 -0.539741 

在調(diào)用fillna時(shí)使用字典,你可以為不同列設(shè)定不同的填充值:

In: 

  1. df.fillna({1: 0.5, 2: 0}) 

Out: 

  1.          0         1         2  
  2. 0 -0.204708  0.500000  0.000000  
  3. 1 -0.555730  0.500000  0.000000  
  4. 2  0.092908  0.500000  0.769023  
  5. 3  1.246435  0.500000 -1.296221  
  6. 4  0.274992  0.228913  1.352917  
  7. 5  0.886429 -2.001637 -0.371843  
  8. 6  1.669025 -0.438570 -0.539741 

fillna返回的是一個(gè)新的對(duì)象,但你也可以修改已經(jīng)存在的對(duì)象:

In: 

  1. _ = df.fillna(0, inplace=True
  1. df 

Out: 

  1.         0         1         2  
  2. 0 -0.204708  0.000000  0.000000  
  3. 1 -0.555730  0.000000  0.000000  
  4. 2  0.092908  0.000000  0.769023  
  5. 3  1.246435  0.000000 -1.296221  
  6. 4  0.274992  0.228913  1.352917  
  7. 5  0.886429 -2.001637 -0.371843  
  8. 6  1.669025 -0.438570 -0.539741 

用于重建索引的相同的插值方法也可以用于fillna:

In: 

  1. df = pd.DataFrame(np.random.randn(6, 3))  
  1. df.iloc[2:, 1] = NA  
  1. df.iloc[4:, 2] = NA  
  1. df 

Out: 

  1.          0         1         2  
  2. 0  0.476985  3.248944 -1.021228  
  3. 1 -0.577087  0.124121  0.302614  
  4. 2  0.523772       NaN  1.343810  
  5. 3 -0.713544       NaN -2.370232  
  6. 4 -1.860761       NaN       NaN  
  7. 5 -1.265934       NaN       NaN 

In: 

  1. df.fillna(method='ffill'

Out: 

  1.           0         1         2  
  2. 0  0.476985  3.248944 -1.021228  
  3. 1 -0.577087  0.124121  0.302614  
  4. 2  0.523772  0.124121  1.343810  
  5. 3 -0.713544  0.124121 -2.370232  
  6. 4 -1.860761  0.124121 -2.370232  
  7. 5 -1.265934  0.124121 -2.370232 

In: 

  1. df.fillna(method='ffill'limit=2

Out: 

  1.         0         1         2  
  2. 0  0.476985  3.248944 -1.021228  
  3. 1 -0.577087  0.124121  0.302614  
  4. 2  0.523772  0.124121  1.343810  
  5. 3 -0.713544  0.124121 -2.370232  
  6. 4 -1.860761       NaN -2.370232  
  7. 5 -1.265934       NaN -2.370232 

使用fillna你可以完成很多帶有一點(diǎn)創(chuàng)造性的工作。例如,你可以將Series的平均值或中位數(shù)用于填充缺失值:

In: 

  1. data = pd.Series([1., NA, 3.5, NA, 7])  
  1. data.fillna(data.mean()) 

Out: 

  1. 0     1.000000  
  2. 1     3.833333  
  3. 2     3.500000  
  4. 3     3.833333  
  5. 4     7.000000  
  6. dtype: float64 

以下是fillna的函數(shù)參數(shù)。

  •  value:標(biāo)量值或字典型對(duì)象用于填充缺失值
  •  method:插值方法,如果沒有其他參數(shù),默認(rèn)是'ffill'
  •  axis:需要填充的軸,默認(rèn)axis=0
  •  inplace:修改被調(diào)用的對(duì)象,而不是生成一個(gè)備份
  •  limit:用于前向或后向填充時(shí)最大的填充范圍

關(guān)于作者:韋斯·麥金尼(Wes McKinney)是流行的Python開源數(shù)據(jù)分析庫pandas的創(chuàng)始人。他是一名活躍的演講者,也是Python數(shù)據(jù)社區(qū)和Apache軟件基金會(huì)的Python/C++開源開發(fā)者。目前他在紐約從事軟件架構(gòu)師工作。

本文摘編自《利用Python進(jìn)行數(shù)據(jù)分析》(原書第2版),經(jīng)出版方授權(quán)發(fā)布。 

 

責(zé)任編輯:龐桂玉 來源: 大數(shù)據(jù)DT
相關(guān)推薦

2021-08-02 23:15:20

Pandas數(shù)據(jù)采集

2022-04-01 20:29:26

Pandas數(shù)據(jù)存儲(chǔ)

2021-08-09 13:31:25

PythonExcel代碼

2022-10-19 14:30:59

2011-03-28 16:14:38

jQuery

2021-02-04 09:00:57

SQLDjango原生

2022-08-04 10:39:23

Jenkins集成CD

2021-09-02 08:56:48

JavaBMIHashSet

2021-02-10 09:34:40

Python文件的壓縮PyCharm

2022-04-24 10:33:56

大數(shù)據(jù)數(shù)據(jù)分析

2009-04-22 09:17:19

LINQSQL基礎(chǔ)

2021-05-09 22:41:43

Python數(shù)據(jù)統(tǒng)計(jì)

2021-05-10 06:48:11

Python騰訊招聘

2021-01-21 09:10:29

ECharts柱狀圖大數(shù)據(jù)

2021-01-08 10:32:24

Charts折線圖數(shù)據(jù)可視化

2021-02-02 13:31:35

Pycharm系統(tǒng)技巧Python

2012-01-11 13:40:35

移動(dòng)應(yīng)用云服務(wù)

2020-03-08 22:06:16

Python數(shù)據(jù)IP

2021-12-11 20:20:19

Python算法線性

2017-10-27 10:29:35

人臉識(shí)別UbuntuPython
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)