1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 5556字,需瀏覽 12分鐘

         ·

        2021-02-09 12:07

        作者:韋斯·麥金尼(Wes McKinney)譯者:徐敬一來源:大數(shù)據(jù)DT(ID:hzdashuju)


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


        缺失數(shù)據(jù)會在很多數(shù)據(jù)分析應(yīng)用中出現(xiàn)。pandas的目標之一就是盡可能無痛地處理缺失值。


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

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

        In :?

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

        string_data

        Out:

        0??????aardvark
        1?????artichoke
        2????????????NaN
        3???????avocado
        dtype:?object

        In:

        string_data.isnull()

        Out:

        0?????False
        1?????False
        2??????True
        3?????False
        dtype:?bool

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

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

        In:

        string_data[0]?=?None

        string_data.isnull()

        Out:

        0??????True
        1?????False
        2??????True
        3?????False
        dtype:?bool

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

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


        01 過濾缺失值

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

        In:

        from?numpy?import?nan?as?NA

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

        data.dropna()

        Out:

        0?????1.0
        2?????3.5
        4?????7.0
        dtype:?float64

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

        In:

        data[data.notnull()]

        Out:

        0?????1.0
        2?????3.5
        4?????7.0
        dtype:?float64

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

        In:

        data?=?pd.DataFrame([[1.,?6.5,?3.],?[1.,?NA,?NA]
        ?????????????????????[NA,?NA,?NA],?[NA,?6.5,?3.]])

        cleaned?=?data.dropna()

        data

        Out:

        ???0?????1?????2
        0??1.0??6.5??3.0
        1??1.0??NaN??NaN
        2??NaN??NaN??NaN
        3??NaN??6.5??3.0

        In:

        cleaned

        Out:

        ???0?????1?????2
        0??1.0??6.5??3.0

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

        In:

        data.dropna(how='all')

        Out:

        ?    0?? ?1????2
        0??1.0??6.5??3.0
        1??1.0??NaN??NaN
        3??NaN??6.5??3.0

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

        In:

        data[4]?=?NA

        data

        Out:

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

        In:

        data.dropna(axis=1,?how='all')

        Out:

             0????1????2
        0??1.0??6.5??3.0
        1??1.0??NaN??NaN
        2??NaN??NaN??NaN
        3??NaN??6.5??3.0

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

        In:

        df?=?pd.DataFrame(np.random.randn(7,?3))

        df.iloc[:4,?1]?=?NA

        df.iloc[:2,?2]?=?NA

        df

        Out:

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

        In:

        df.dropna()

        Out:

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

        In:

        df.dropna(thresh=2)

        Out:

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


        02 補全缺失值

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

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

        In:

        df.fillna(0)

        Out:

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

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

        In:

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

        Out:

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

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

        In:

        _?=?df.fillna(0,?inplace=True)

        df

        Out:

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

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

        In:

        df?=?pd.DataFrame(np.random.randn(6,?3))

        df.iloc[2:,?1]?=?NA

        df.iloc[4:,?2]?=?NA

        df

        Out:

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

        In:

        df.fillna(method='ffill')

        Out:

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

        In:

        df.fillna(method='ffill',?limit=2)

        Out:

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

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

        In:

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

        data.fillna(data.mean())

        Out:

        0?????1.000000
        1?????3.833333
        2?????3.500000
        3?????3.833333
        4?????7.000000
        dtype:?float64

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

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

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


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

        延伸閱讀利用Python進行數(shù)據(jù)分析
        點擊上圖了解及購買
        轉(zhuǎn)載請聯(lián)系微信:DoctorData

        推薦語:Python數(shù)據(jù)分析經(jīng)典暢銷書全新升級,第1版中文版累計銷售100000冊。針對Python 3.6進行全面修訂和更新,涵蓋新版的pandas、NumPy、IPython和Jupyter。


        也可以加一下老胡的微信
        圍觀朋友圈~~~


        推薦閱讀

        (點擊標題可跳轉(zhuǎn)閱讀)

        干掉 LaTeX !用BookDown寫本書
        101道Numpy、Pandas練習(xí)題
        【資源干貨】香港中文大學(xué)《深度學(xué)習(xí)導(dǎo)論》2021課件
        機器學(xué)習(xí)深度研究:特征選擇中幾個重要的統(tǒng)計學(xué)概念

        老鐵,三連支持一下,好嗎?↓↓↓

        瀏覽 25
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            男同乱淫h肉动漫 | 噜噜噜色网 | 欧美日韩大香蕉 | 国产精品-老牛影视 | 人人看人人摸 | 欧美乱大交 | 欧美高潮呻吟 | 撕掉她的衣服吮的双乳小说 | 双乳奶水饱满少妇呻吟一好爽毛片_区 | 中国免费毛片视频 |