成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[381102]]

 pandas對象的所有描述性統計信息默認情況下是排除缺失值的。

pandas對象中表現缺失值的方式并不完美,但是它對大部分用戶來說是有用的。對于數值型數據,pandas使用浮點值NaN(Not a Number來表示缺失值)。我們稱NaN為容易檢測到的標識值:

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(不可用)。在統計學應用中,NA數據可以是不存在的數據或者是存在但不可觀察的數據(例如在數據收集過程中出現了問題)。當清洗數據用于分析時,對缺失數據本身進行分析以確定數據收集問題或數據丟失導致的數據偏差通常很重要。

Python內建的None值在對象數組中也被當作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項目持續改善處理缺失值的內部細節,但是用戶API函數,比如pandas. isnull,抽象掉了很多令人厭煩的細節。處理缺失值的相關函數列表如下:

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

01 過濾缺失值

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

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 

上面的例子與下面的代碼是等價的:

In: 

  1. data[data.notnull()] 

Out: 

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

當處理DataFrame對象時,事情會稍微更復雜一點。你可能想要刪除全部為NA或包含有NA的行或列。dropna默認情況下會刪除包含缺失值的行:

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’時,將刪除所有值均為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 

如果要用同樣的方式去刪除列,傳入參數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的行的相關方法往往涉及時間序列數據。假設你只想保留包含一定數量的觀察值的行。你可以用thresh參數來表示:

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 補全缺失值

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

大多數情況下,主要使用fillna方法來補全缺失值。調用fillna時,可以使用一個常數來替代缺失值:

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 

在調用fillna時使用字典,你可以為不同列設定不同的填充值:

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返回的是一個新的對象,但你也可以修改已經存在的對象:

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你可以完成很多帶有一點創造性的工作。例如,你可以將Series的平均值或中位數用于填充缺失值:

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的函數參數。

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

關于作者:韋斯·麥金尼(Wes McKinney)是流行的Python開源數據分析庫pandas的創始人。他是一名活躍的演講者,也是Python數據社區和Apache軟件基金會的Python/C++開源開發者。目前他在紐約從事軟件架構師工作。

本文摘編自《利用Python進行數據分析》(原書第2版),經出版方授權發布。 

 

責任編輯:龐桂玉 來源: 大數據DT
相關推薦

2021-08-02 23:15:20

Pandas數據采集

2022-10-19 14:30:59

2021-08-09 13:31:25

PythonExcel代碼

2022-04-01 20:29:26

Pandas數據存儲

2022-08-04 10:39:23

Jenkins集成CD

2011-03-28 16:14:38

jQuery

2021-02-04 09:00:57

SQLDjango原生

2009-04-22 09:17:19

LINQSQL基礎

2021-09-02 08:56:48

JavaBMIHashSet

2021-02-10 09:34:40

Python文件的壓縮PyCharm

2022-04-24 10:33:56

大數據數據分析

2021-12-11 20:20:19

Python算法線性

2020-03-08 22:06:16

Python數據IP

2012-01-11 13:40:35

移動應用云服務

2021-02-02 13:31:35

Pycharm系統技巧Python

2021-05-10 06:48:11

Python騰訊招聘

2021-01-21 09:10:29

ECharts柱狀圖大數據

2021-01-08 10:32:24

Charts折線圖數據可視化

2021-05-09 22:41:43

Python數據統計

2021-01-30 10:37:18

ScrapyGerapy網絡爬蟲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久av | 超碰最新在线 | 91久久精品国产91久久性色tv | 在线91 | 黄色网页在线观看 | 成人性视频在线播放 | 日韩一区二区三区视频 | 日韩精品久久 | 91影院 | 亚洲精品一区二区在线观看 | 日韩一区二区在线视频 | 香蕉视频黄色 | 色性av | 国产 欧美 日韩 一区 | 国产精品日韩欧美一区二区三区 | 国产成人精品一区二 | 国产又色又爽又黄又免费 | 久久久国产一区二区 | 亚洲视频在线观看 | 99亚洲精品 | 日本成人福利 | 密乳av | 亚洲国产成人精品久久 | 91在线观看免费 | 亚洲成人网在线播放 | caoporn免费在线视频 | 91原创视频 | 欧美视频一区二区三区 | 日韩av电影在线观看 | 99精品久久久 | 99九色| 日本激情视频在线播放 | 欧美不卡 | 精品国产1区2区3区 在线国产视频 | 久久精品女人天堂av | 国产1区 | 亚洲国产第一页 | 亚洲欧美日韩在线不卡 | 久久国产精品免费 | 久久精品国产一区二区三区不卡 | 久久久精品一区 |