亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Python語言處理各類空值的方法研究

        2024-01-24 08:52:09蔡黎亞李淑萍
        電腦知識(shí)與技術(shù) 2023年34期
        關(guān)鍵詞:庫中語句運(yùn)算

        蔡黎亞 李淑萍

        摘要:在各類編程語言中的空值表述都有所不同。對(duì)于數(shù)據(jù)分析而言,篩選出當(dāng)前表內(nèi)的空值并對(duì)其進(jìn)行有效填充或進(jìn)行其他操作,是數(shù)據(jù)清洗過程中的重要一環(huán)。該文對(duì)各類編程語言中可能出現(xiàn)的空值表述方法進(jìn)行了梳理匯總,然后通過Python中的pandas擴(kuò)展庫相關(guān)函數(shù)操作闡述了Python語言處理這些不同語境中空值的常用方法。

        關(guān)鍵詞:數(shù)據(jù)處理;Python;Pandas;空值;None;NaN;NaT;Null;NA

        中圖分類號(hào):TP311? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A

        文章編號(hào):1009-3044(2023)34-0038-03

        開放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID)

        0 引言

        在數(shù)據(jù)處理過程中會(huì)遇到形態(tài)各異的空值運(yùn)算,比如Java中的Null,NumPy擴(kuò)展庫中的NaN或者pandas擴(kuò)展庫中的NA或者Python原生語言中的None類型等,都是各類編程語言對(duì)空值的描述。它們無論在表述方式和運(yùn)算方法上都有所不同。要在數(shù)據(jù)清洗處理階段準(zhǔn)確找出不同來源表格中的空值項(xiàng),就需要掌握這些語言對(duì)空值項(xiàng)的表述方法。Python作為數(shù)據(jù)分析領(lǐng)域的重要開發(fā)語言,在數(shù)據(jù)處理擴(kuò)展庫Pandas中有很多便捷的函數(shù)方法來處理各類的空值運(yùn)算。

        1 各類編程語言中的空值表述

        在Python語言中的空值(也稱之為缺失值)是用None表示,其數(shù)據(jù)類型就是NoneType。None不支持任何運(yùn)算——和其他數(shù)據(jù)類型的運(yùn)算只返回False,但可以把None賦值給任何變量以表示為空[1],而兩個(gè)None進(jìn)行比較時(shí)是相等關(guān)系。

        在Python的NumPy擴(kuò)展庫中,空值是用NaN(也可以寫作nan) 表示,它的數(shù)據(jù)類型是浮點(diǎn)型float。nan在NumPy庫中的含義是not a number[2]。任何與nan的運(yùn)算結(jié)果都是nan,無窮大減無窮大會(huì)產(chǎn)生nan,而無窮大乘以零或無窮小除以無窮大等運(yùn)算都會(huì)導(dǎo)致產(chǎn)生nan。兩個(gè)nan比較并不相等,這些nan的運(yùn)算特點(diǎn)與Python中的None是有所不同的。

        而Pandas的運(yùn)算是基于NumPy庫構(gòu)建的,因此通過NumPy庫運(yùn)算的數(shù)值類空值往往用NaN表示(數(shù)值類型的空值)[3],也可能存在None(如表示字符串類型的空值)或者NaT(表示時(shí)間類型的空值)等。當(dāng)None被運(yùn)算時(shí)可能會(huì)觸發(fā)NumPy的運(yùn)算機(jī)制而轉(zhuǎn)換為NaN。

        另外,在其他類編程語言中,如Java、PHP、C++等語言的空值往往是用Null表示。Null在Python語言中是一個(gè)普通的字符串,但Python中存在一個(gè)與Null相關(guān)的比較函數(shù)isnull()可判斷各類其他語言運(yùn)算后所存在的空值Null。

        而如果存在類似a=’ ’這樣的賦值方式,則并不會(huì)被系統(tǒng)認(rèn)定為空,而會(huì)被認(rèn)為是非空的字符串。這些不同語言及擴(kuò)展庫對(duì)空值的不同描述會(huì)在用戶進(jìn)行數(shù)據(jù)清洗或整理時(shí),帶來不小的困擾[4]。

        在Python的Pandas擴(kuò)展庫中推出了一個(gè)頂層的缺失值容器pd.NA來承載和處理Pandas庫內(nèi)出現(xiàn)的各類空值,它嘗試把諸多類型的空值統(tǒng)一在pd.NA這個(gè)頂層的容器內(nèi),并為此創(chuàng)建了一個(gè)數(shù)據(jù)類型NAType[5]。因此,很多教程中也會(huì)把NA作為Pandas庫對(duì)空值類型的一種專屬描述。

        Pandas庫中具有后綴名為na的各種函數(shù),如df.fillna(), df.dropna(),df.isna()等,它們都可直接操作和處理不同類型的空值。

        隨著Pandas庫的版本更新,相關(guān)na函數(shù)的功能也越來越完善,但依然與np.NaN等處理方法還存在一些差異。比如pd.NA是整數(shù),np.NaN是浮點(diǎn)數(shù)。而pd.NA常用于整數(shù)、布爾型或字符串類型。在與1和0比較時(shí),pd.NA的輸出是NA類型,而np.nan與1和0比較的結(jié)果是False。這些處理上的細(xì)微差異稍不留意就可能影響最終數(shù)據(jù)分析的準(zhǔn)確性。

        2 過濾空值

        分析數(shù)據(jù)時(shí)會(huì)遇到許多數(shù)據(jù)不完整的情況,為了讓分析結(jié)果更接近真實(shí),往往需要在空值處填充既定數(shù)據(jù)(如均值、中位數(shù)等),或者干脆丟棄這些少量而不完整數(shù)據(jù)。這時(shí)Pandas庫中的dropna()或者fillna()就可以方便地完成既定的任務(wù)。

        通過函數(shù)dropna()可刪除數(shù)組對(duì)象DataFrame中存在的一個(gè)或多個(gè)空值列或行數(shù)據(jù),因此常用于數(shù)據(jù)清洗中的過濾缺失值任務(wù)。

        使用df.dropna()方法可以通過軸axis來指明刪除的是行還是列,其主要語法格式如下所示:

        df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False) [3]

        ü axis:可選參數(shù),是指刪除空值所在的行或列,默認(rèn)為0(行)。

        ü how:可選參數(shù),是指刪除的條件,默認(rèn)為any(含有空值的任意行或列),還可選擇all (全是空值的行或列)。

        ü thresh:可選參數(shù),是指刪除空值后保留的行或列數(shù),默認(rèn)為空(全部都保留)。

        ü subset:可選參數(shù),是指定義在哪些列集合中查找空值,默認(rèn)為空(全部列都檢索)。

        ü inplace:可選參數(shù),是指是否就地修改原數(shù)據(jù)對(duì)象,默認(rèn)為False。

        在該語法中,不存在必選參數(shù),單獨(dú)使用df.dropna()即可刪除所有存在空值的行數(shù)據(jù)。下例所示為通過df.dropna()刪除數(shù)據(jù)對(duì)象中各類空值的程序?qū)嵗?/p>

        在下例中,使用四個(gè)Series創(chuàng)建了一個(gè)數(shù)據(jù)對(duì)象df。其中salary列由NaN、None、<NA>這三種空值類型組成,而other列則是由pd.Series([''])所創(chuàng)建。它有一個(gè)看上去并不存在任何值卻并非空值的一個(gè)空字符串作為列首的數(shù)據(jù)。

        import pandas as pd

        import numpy as np

        d1 = pd.Series([101, 102, 103, 104])

        d2 = pd.Series(['Alex', 'Peter', 'Lisa'])

        d3 = pd.Series([np.NaN, None, pd.NA, None])

        d4 = pd.Series([''])

        df = pd.DataFrame({'id': d1, 'name': d2, 'salary': d3, 'other': d4})

        print('原數(shù)組->\n', df)

        原數(shù)組->

        id? ? name salary other

        0? 101? ? Alex? ? NaN

        1? 102? Peter? ? None? ? NaN

        2? 103? ? Lisa? ? <NA>? ? NaN

        3? 104? ? NaN? ? None? ? NaN

        使用df.dropna()) 語句即可刪除所有存在空值的行數(shù)據(jù),但介于df的每行都有空值,因此返回為空對(duì)象。

        print('dropna()->\n', df.dropna())

        dropna()->

        Empty DataFrame

        Columns: [id, name, salary, other]

        Index: []

        在df.dropna(subset=['name', 'other'])) 語句中使用了參數(shù)subset來指定需檢索的列名稱name與other。檢索的結(jié)果是除了第一行外,在這兩列內(nèi)的其他行數(shù)據(jù)都存在空值(被刪除)。這里需要注意的是,pd.Series([''])所創(chuàng)建的空字符串并不被認(rèn)為是空值。

        print('dropna(subset=[])->\n', df.dropna(subset=['name', 'other']))

        dropna(subset=[])->

        id? name salary other

        0? 101? Alex? ? NaN

        在df.dropna(axis=1)) 語句中使用了軸參數(shù)axis=1指明刪除所有存在空值的列,因此只輸出了id列內(nèi)容。

        print('dropna(axis=1)->\n', df.dropna(axis=1))

        dropna(axis=1)->

        id

        0? 101

        1? 102

        2? 103

        3? 104

        在df.dropna(axis=1, how='all') 語句中,除了通過軸參數(shù)axis=1來確定刪除軸的方向?yàn)榭v向之外,還使用了參數(shù)how=all來指明刪除全部是空值的列。由于只有salary列數(shù)據(jù)全部都是空值,因此輸出的結(jié)果為不包含salary列的其他列內(nèi)容。

        print("drop.na(axis=1,how='all')->\n", df.dropna(axis=1, how='all'))

        drop.na(axis=1,how='all')->

        id? ? name other

        0? 101? ? Alex

        1? 102? Peter? ? NaN

        2? 103? ? Lisa? ? NaN

        3? 104? ? NaN? ? NaN

        3 填充空值

        外部獲取到的數(shù)據(jù)經(jīng)常會(huì)存在數(shù)據(jù)缺失的情況,如何填充缺失值,填充哪些類的缺失值是數(shù)據(jù)清洗過程中常見的而又重要的一類操作[6]。Pandas庫中的fillna()就可以完成此類任務(wù)。

        填充操作的函數(shù)使用方法會(huì)比刪除操作復(fù)雜一些,它擁有更多的參數(shù)。

        df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None) [3]

        ü value:可選參數(shù),是指填充值,可以是標(biāo)量、字典、Series或DataFrame。默認(rèn)為空。

        ü method:可選參數(shù),是指填充方法,可以是向后(backfill、bfill) 或向前填充(ffill、pad) ,默認(rèn)為空(不指定)。

        ü axis:可選參數(shù),是指行方向還是列方向填充,默認(rèn)為空。

        ü inplace:可選參數(shù),是指是否就地修改原數(shù)據(jù)對(duì)象。

        ü limit:可選參數(shù),是指填充的數(shù)量限制,默認(rèn)為空(不限定填充數(shù)量,全部填充)。

        ü downcast:可選參數(shù),是指填充方向是向下廣播,默認(rèn)為空(不指定填充方向)。

        參數(shù)說明:

        這些參數(shù)雖然全是可選參數(shù),但至少需要在參數(shù)value與method中選擇一個(gè)參數(shù)使用。

        在下例中依然創(chuàng)建了一個(gè)含有各類空值的待填充對(duì)象df。

        import pandas as pd

        import numpy as np

        d1 = pd.Series([101, 102, 103, 104])

        d2 = pd.Series(['Alex', 'Peter', 'Lisa'])

        d3 = pd.Series([np.NaN, 6000, pd.NA, None])

        d4 = pd.Series([None, 5, None, 9])

        df = pd.DataFrame({'id': d1, 'name': d2, 'salary': d3, 'other': d4})

        print('原數(shù)據(jù)對(duì)象->\n', df)

        原數(shù)據(jù)對(duì)象->

        id? ? name salary other

        0? 101? ? Alex? ? NaN? ? NaN

        1? 102? Peter? ? 6000? ? 5.0

        2? 103? ? Lisa? ? <NA>? ? NaN

        3? 104? ? NaN? ? None? ? 9.0

        數(shù)據(jù)對(duì)象df中存在有缺失值的現(xiàn)象,使用df.fillna('missing')語句可以對(duì)所有的缺失值使用字符串missing填充。

        print('標(biāo)量填充->\n', df.fillna('missing'))

        標(biāo)量填充->

        id name salary other

        0 101 Alex missing missing

        1 102 Peter 6000 5.0

        2 103 Lisa missing missing

        3 104 missing missing 9.0

        在下面語句中使用df.fillna(df.mean())方法,可利用計(jì)算后的均值來填充。

        print('均值填充->\n', df.fillna(df.mean()))

        均值填充->

        id name salary other

        0 101 Alex 6000.0 7.0

        1 102 Peter 6000.0 5.0

        2 103 Lisa 6000.0 7.0

        3 104 NaN 6000.0 9.0

        在下面語句中使用了參數(shù)method='ffill'和limit=1,它們是指根據(jù)df.ffill()方法向后填充且限定一次。

        print('向后填充限一次->\n', df.fillna(method='ffill', limit=1))

        向后填充限一次->

        id name salary other

        0 101 Alex NaN NaN

        1 102 Peter 6000.0 5.0

        2 103 Lisa 6000.0 5.0

        3 104 Lisa NaN 9.0

        在下面語句中,使用了df.bfill()方法利用后值向前進(jìn)行填充。bfill、ffill這些不僅可以作為method參數(shù)的關(guān)鍵字使用,也是一種可直接使用的填充方法。

        print('向前(后值)填充->\n', df.fillna(method='bfill'))

        向前(后值)填充->

        id name salary other

        0 101 Alex 6000.0 5.0

        1 102 Peter 6000.0 5.0

        2 103 Lisa NaN 9.0

        3 104 NaN NaN 9.0

        使用下面語句可以在指定列“salary”中使用該列的均值來填充空值。

        df['salary'] = df.salary.fillna(df.salary.mean())

        print('指定salary列填充均值->\n', df)

        指定salary列填充均值->

        id name salary other

        0 101 Alex 6000.0 NaN

        1 102 Peter 6000.0 5.0

        2 103 Lisa 6000.0 NaN

        3 104 NaN 6000.0 9.0

        下面語句中使用了df.ffill()函數(shù)在df['salary']列內(nèi)利用前值向后進(jìn)行填充。 (下轉(zhuǎn)第58頁)

        (上接第40頁)

        df['salary'] = df['salary'].ffill()? # 使用ffill()填充,類似method指定

        print('指定salary列向后填充->\n', df)

        指定salary列向后填充->

        id name salary other

        0 101 Alex NaN NaN

        1 102 Peter 6000.0 5.0

        2 103 Lisa 6000.0 NaN

        3 104 NaN 6000.0 9.0

        參數(shù)method是指填充的方法,關(guān)鍵字backfill、bfill是指向后填充,ffill、pad是指向前填充。這些關(guān)鍵字也可以作為df的函數(shù)使用[7],如df.bfill()就是對(duì)既定的數(shù)據(jù)對(duì)象進(jìn)行向后填充。

        4 結(jié)束語

        Pandas庫主要用于對(duì)二維表格式的數(shù)據(jù)清洗與整理過程。在Python進(jìn)行數(shù)據(jù)處理過程中,首先可通過判斷函數(shù)篩選出數(shù)據(jù)中的空值項(xiàng),以此確定空值項(xiàng)所在的位置和表述形態(tài)。再依據(jù)任務(wù)需求對(duì)空值項(xiàng)進(jìn)行填充或刪除過濾,有時(shí)可能還需要去除重復(fù)的數(shù)據(jù)項(xiàng)等。Python的pandas擴(kuò)展庫中包含了諸多的空值處理方法,主要應(yīng)用于對(duì)二維表格式數(shù)據(jù)的清洗與整理過程。但在數(shù)據(jù)清洗過程中需要注意的是,經(jīng)過不同操作處理或轉(zhuǎn)換后的空值可能形態(tài)各異。而在進(jìn)行邏輯運(yùn)算時(shí),其比較的結(jié)果也會(huì)因該空值類型的運(yùn)算特性而有所不同。

        參考文獻(xiàn):

        [1] 蔡黎亞,劉正,唐志峰.零基礎(chǔ)學(xué)Python:基于PyCharm IDE[M].北京:清華大學(xué)出版社,2021.

        [2] NumPy Developers. NumPy英文官網(wǎng)[EB/OL].[2022-10-20].https://numpy.org/doc/stable/user/index.html.

        [3] Zhi Bing. pandas中文網(wǎng)[EB/OL].[2022-10-20].https://www.pypandas.cn/.

        [4] 蔡黎亞,李淑萍,田英杰.基于大數(shù)據(jù)平臺(tái)的農(nóng)業(yè)智能信息處理系統(tǒng)設(shè)計(jì)[J].農(nóng)機(jī)化研究,2023,45(2):207-210.

        [5] Python Software Foundation. Python 官網(wǎng)文檔 [EB/OL]. https://docs.python.org, 2023-02

        [6] CAI L Y,YAO S C.Application of big data technology in blockchain computing[C]//ICAIIS 2021:2021 2nd International Conference on Artificial Intelligence and Information Systems.ACM,2021:1-3.

        [7] 李慶輝.深入淺出Pandas:利用Python進(jìn)行數(shù)據(jù)處理與分析[M].北京:機(jī)械工業(yè)出版社,2021.

        【通聯(lián)編輯:代影】

        猜你喜歡
        庫中語句運(yùn)算
        動(dòng)物城堡
        動(dòng)物城堡
        重視運(yùn)算與推理,解決數(shù)列求和題
        重點(diǎn):語句銜接
        有趣的運(yùn)算
        精彩語句
        智能盤庫在自動(dòng)化立體庫中的探索和應(yīng)用
        “整式的乘法與因式分解”知識(shí)歸納
        撥云去“誤”學(xué)乘除運(yùn)算
        如何搞定語句銜接題
        可免费观看的av毛片中日美韩| 91最新免费观看在线| 丰满人妻中文字幕乱码| 熟妇人妻精品一区二区视频免费的| 国产卡一卡二卡3卡4乱码| 久久不见久久见免费视频7| 国产丝袜免费精品一区二区 | 日本不卡一区二区三区在线| 国内精品少妇高潮视频| 欧美日韩视频在线第一区 | 国产欧美亚洲另类第一页| 日本女同性恋一区二区三区网站| 中国女人内谢69xxxxxa片| 国产成人麻豆精品午夜福利在线| 欧美精品v欧洲高清| 亚洲永久免费中文字幕| 久久亚洲av成人无码电影a片| 婷婷四房色播| 国产内射视频在线播放| 99国产精品久久一区二区三区| 亚洲精品国产suv一区88| 尤物视频一区二区| 蜜臀一区二区av天堂| 老鸭窝视频在线观看| 中国丰满熟妇av| 国产女人体一区二区三区| 久久精品国产亚洲av久按摩| 亚洲国产成人片在线观看| 国产成人精选在线不卡| 久久精品一区二区三区夜夜| 精品无码一区二区三区的天堂| 亚洲av综合色区无码一二三区| 国产亚洲欧洲三级片A级| 午夜男女靠比视频免费| 久久成人国产精品免费软件 | 少妇粉嫩小泬喷水视频www| 精品久久久久一区二区国产| 亚洲大胆美女人体一二三区| 免费观看a级片| 99久久久无码国产精品9| 亚洲天堂色婷婷一区二区|