国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线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)算
如何搞定語句銜接題
西安市| 英超| 古丈县| 水富县| 甘谷县| 高阳县| 耒阳市| 东光县| 淮北市| 眉山市| 宁河县| 盘山县| 安溪县| 平远县| 黄冈市| 大方县| 白玉县| 越西县| 易门县| 齐河县| 凤山县| 龙游县| 财经| 万山特区| 三台县| 崇阳县| 博野县| 自治县| 江西省| 天祝| 个旧市| 桃江县| 青龙| 抚顺市| 新密市| 揭西县| 元谋县| 伊吾县| 安泽县| 西峡县| 泗水县|