Pandas中的空字符串(非缺失值)處理方式
Pandas的空字符串(非缺失值)處理
在使用pandas處理數(shù)據(jù)時(shí),會(huì)遇到這樣一個(gè)問(wèn)題:
打開(kāi)文檔查看某些列明顯有很多是空的,但是在python里用dataframe.info統(tǒng)計(jì)出來(lái)并不是空的,這是因?yàn)閑xcel表里這些數(shù)據(jù)看起來(lái)是空的值,但其實(shí)是一個(gè)空格,但是用isnull判斷是為False的。
解決方案
對(duì)整張表dataframe替換空格為np.nan,可以使用replace方法通過(guò)正則匹配空格,然后替換:
df.replace(to_replace=r'^\s*$',value=np.nan,regex=True,inplace=True)
其中\(zhòng)s表示空白字符,匹配任何空白字符,包括空格、制表符、換頁(yè)符等,*表示任意個(gè)。
Pandas知識(shí)點(diǎn)-缺失值處理
數(shù)據(jù)處理過(guò)程中,經(jīng)常會(huì)遇到數(shù)據(jù)有缺失值的情況,介紹如何用Pandas處理數(shù)據(jù)中的缺失值。
什么是缺失值
對(duì)數(shù)據(jù)而言,缺失值分為兩種,一種是Pandas中的空值,另一種是自定義的缺失值。
1. Pandas中的空值有三個(gè):np.nan (Not a Number) 、 None 和 pd.NaT(時(shí)間格式的空值,注意大小寫(xiě)不能錯(cuò)),這三個(gè)值可以用Pandas中的函數(shù)isnull(),notnull(),isna()進(jìn)行判斷。
isnull()和notnull()的結(jié)果互為取反,isnull()和isna()的結(jié)果一樣。對(duì)于這三個(gè)函數(shù),只需要用其中一個(gè)就可以識(shí)別出數(shù)據(jù)中是否有空值。如果數(shù)據(jù)量較大,再配合numpy中的any()和all()函數(shù)就行了。
需要特別注意兩點(diǎn):
- 如果某一列數(shù)據(jù)全是空值且包含pd.NaT,np.nan和None會(huì)自動(dòng)轉(zhuǎn)換成pd.NaT。
- 空值(np.nan、None、pd.NaT)既不是空字符串"",也不是空格" "。
從Python解釋器來(lái)看,np.nan的類型是float,None的類型是NoneType,兩者在Pandas中都顯示為NaN,pd.NaT的類型是Pandas中的NaTType,顯示為NaT。而不管是空字符串還是空格,其數(shù)據(jù)類型都是字符串,Pandas判斷的結(jié)果不是空值。
2. 自定義缺失值有很多不同的形式,如上面剛說(shuō)的空字符串和空格(當(dāng)然,一般不用這兩個(gè),因?yàn)榭雌饋?lái)不夠直觀)。
在獲取數(shù)據(jù)時(shí),可能會(huì)有一些數(shù)據(jù)無(wú)法得到,也可能數(shù)據(jù)本身就沒(méi)有,造成了缺失值。對(duì)于這些缺失值,在獲取數(shù)據(jù)時(shí)通常會(huì)用一些符號(hào)之類的數(shù)據(jù)來(lái)代替,如問(wèn)號(hào)?,斜杠/,字母NA等。
如果處理的數(shù)據(jù)是自己獲取的,那自己知道缺失值是怎么定義的,如果數(shù)據(jù)是其他人提供的,一般會(huì)同時(shí)提供數(shù)據(jù)的說(shuō)明文檔,說(shuō)明文檔中會(huì)注明缺失值的定義方式。
對(duì)于自定義缺失值,不能用isnull()等三個(gè)函數(shù)來(lái)判斷,不過(guò)可以用isin()函數(shù)來(lái)判斷。找到這些值后,將其替換成np.nan,數(shù)據(jù)就只有空值一種缺失值了。
此外,在數(shù)據(jù)處理的過(guò)程中,也可能產(chǎn)生缺失值,如除0計(jì)算,數(shù)字與空值計(jì)算等。
判斷缺失值
1. 自定義缺失值的判斷和替換
isin(values): 判斷Series或DataFrame中是否包含某些值,可以傳入一個(gè)可迭代對(duì)象、Series、DataFrame或字典。在我們判斷某個(gè)自定義的缺失值是否存在于數(shù)據(jù)中時(shí),用列表的方式傳入就可以了。
replace(to_replace=None, value=None): 替換Series或DataFrame中的指定值,一般傳入兩個(gè)參數(shù),to_replace為被替換的值,value為替換后的值。to_replace和value不僅支持Python中的整型、字符串、列表、字典等,還支持正則表達(dá)式。
使用replace()時(shí),默認(rèn)返回原數(shù)據(jù)的一個(gè)副本,replace()中的inplace參數(shù)默認(rèn)為False,將inplace參數(shù)修改為T(mén)rue,則會(huì)修改數(shù)據(jù)本身。其他參數(shù)這里就不展開(kāi)了,有需要可以自己添加。
其實(shí)replace()函數(shù)已經(jīng)可以用于缺失值的填充處理了,直接一步到位,而不用先替換成空值再處理。當(dāng)然,先替換成空值,可以與空值一起處理。
2. 空值判斷
isnull(): 判斷Series或DataFrame中是否包含空值,與isna()結(jié)果相同,與notnull()結(jié)果相反。返回結(jié)果是一個(gè)與原數(shù)據(jù)形狀相同的Series或DataFrame。
如果數(shù)據(jù)很多,我們不可能肉眼觀察返回結(jié)果中的布爾值,所以需要借助numpy中的any()函數(shù)或all()函數(shù),進(jìn)一步對(duì)結(jié)果進(jìn)行判斷。
刪除缺失值
dropna(axis=0, how="any", thresh=None, subset=None, inplace=False): 刪除Series或DataFrame中的空值。
axis: axis參數(shù)默認(rèn)為0('index'),按行刪除,即刪除有空值的行。將axis參數(shù)修改為1或‘columns’,則按列刪除,即刪除有空值的列。在實(shí)際的應(yīng)用中,一般不會(huì)按列刪除,例如數(shù)據(jù)中的一列表示年齡,不能因?yàn)槟挲g有缺失值而刪除所有年齡數(shù)據(jù)。
how: how參數(shù)默認(rèn)為any,只要一行(或列)數(shù)據(jù)中有空值就會(huì)刪除該行(或列)。將how參數(shù)修改為all,則只有一行(或列)數(shù)據(jù)中全部都是空值才會(huì)刪除該行(或列)。
thresh: 表示刪除空值的界限,傳入一個(gè)整數(shù)。如果一行(或列)數(shù)據(jù)中少于thresh個(gè)非空值(non-NA values),則刪除。?也就是說(shuō),一行(或列)數(shù)據(jù)中至少要有thresh個(gè)非空值,否則刪除。
- subset: 刪除空值時(shí),只判斷subset指定的列(或行)的子集,其他列(或行)中的空值忽略,不處理。當(dāng)按行進(jìn)行刪除時(shí),subset設(shè)置成列的子集,反之。
- inplace: 默認(rèn)為False,返回原數(shù)據(jù)的一個(gè)副本。將inplace參數(shù)修改為T(mén)rue,則會(huì)修改數(shù)據(jù)本身。
刪除缺失值,必然會(huì)導(dǎo)致數(shù)據(jù)量的減少,如果缺失值占數(shù)據(jù)的比例較大,比如超過(guò)了數(shù)據(jù)的10%(具體標(biāo)準(zhǔn)根據(jù)項(xiàng)目來(lái)定),刪除數(shù)據(jù)對(duì)數(shù)據(jù)分析的結(jié)果會(huì)有很大的影響,不合理。
填充缺失值
fillna(value=None, method=None, axis=None, inplace=False, limit=None): 填充Series或DataFrame中的空值。
value: 表示填充的值,可以是一個(gè)指定值,也可以是字典, Series或DataFrame。
method: 填充的方式,默認(rèn)為None。有 ffill,pad,bfill,backfill 四種填充方式可以使用,ffill 和 pad 表示用缺失值的前一個(gè)值填充,如果axis=0,則用空值上一行的值填充,如果axis=1,則用空值左邊的值填充。假如空值在第一行或第一列,以及空值前面的值全都是空值,則無(wú)法獲取到可用的填充值,填充后依然保持空值。bfill 和 backfill 表示用缺失值的后一個(gè)值填充,axis的用法以及找不到填充值的情況同 ffill 和 pad 。
注意:當(dāng)指定填充方式method時(shí),不能同時(shí)指定填充值value,否則報(bào)錯(cuò)。
axis: 通常配合method參數(shù)使用,axis=0表示按行,axis=1表示按列。
limit: 表示填充執(zhí)行的次數(shù)。如果是按行填充,則填充一行表示執(zhí)行一次,按列同理。
在缺失值填充時(shí),填充值是自定義的,對(duì)于數(shù)值型數(shù)據(jù),最常用的兩種填充值是用該列的均值和眾數(shù)。DataFrame的眾數(shù)也是一個(gè)DataFrame數(shù)據(jù),眾數(shù)可能有多個(gè)(極限情況下,當(dāng)數(shù)據(jù)中沒(méi)有重復(fù)值時(shí),眾數(shù)就是原DataFrame本身),所以用mode()函數(shù)求眾數(shù)時(shí)取第一行用于填充就行了。
除了可以在fillna()函數(shù)中傳入method參數(shù)指定填充方式外,Pandas中也實(shí)現(xiàn)了不同填充方式的函數(shù),可以直接調(diào)用。
pad(axis=0, inplace=False, limit=None): 用缺失值的前一個(gè)值填充。
- ffill(): 同pad()。
- bfill(): 用缺失值的后一個(gè)值填充。
- backfill(): 同bfill()。
在進(jìn)行數(shù)據(jù)填充時(shí),可能填充之后還有空值,如用ffill 和 pad填充時(shí),數(shù)據(jù)第一行就是空值。對(duì)于這種情況,需要在填充前人工進(jìn)行判斷,避免選擇不適合的填充方式,并在填充完成后,再檢查一次數(shù)據(jù)中是否還有空值。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python深度學(xué)習(xí)實(shí)戰(zhàn)PyQt5基本控件使用解析
PyQt5 提供了豐富的輸入輸出控件。本文介紹通過(guò) QtDesigner 工具欄創(chuàng)建常用的基本控件,包括各種按鈕控件、文本輸入控件和調(diào)節(jié)輸入控件2021-10-10Windows下安裝python MySQLdb遇到的問(wèn)題及解決方法
這篇文章主要介紹了Windows下安裝python MySQLdb遇到的問(wèn)題及解決方法,需要的朋友可以參考下2017-03-03python實(shí)現(xiàn)隨機(jī)調(diào)用一個(gè)瀏覽器打開(kāi)網(wǎng)頁(yè)
下面小編就為大家分享一篇python實(shí)現(xiàn)隨機(jī)調(diào)用一個(gè)瀏覽器打開(kāi)網(wǎng)頁(yè),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04基于Python實(shí)現(xiàn)萬(wàn)年歷制作
制作一個(gè)萬(wàn)年歷是一個(gè)有趣的Python項(xiàng)目,它可以讓您查看任何年份的日歷并獲得特定日期的信息,下面我們就來(lái)看看具體是如何使用Python實(shí)現(xiàn)的吧2023-12-12Python自動(dòng)化辦公之清理重復(fù)文件詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Python清理重復(fù)的文件,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下2022-05-05Python實(shí)現(xiàn)準(zhǔn)確獲取PDF文件中的標(biāo)題
想要在PDF文件中,解析獲取全部的標(biāo)題,是一件比較麻煩的事情,這篇文章將介紹一種較為準(zhǔn)確的提取標(biāo)題的方式,感興趣的小伙伴可以了解一下2024-02-02Python 元組拆包示例(Tuple Unpacking)
今天小編就為大家分享一篇Python 元組拆包實(shí)例(Tuple Unpacking),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12PyTorch 中的傅里葉卷積實(shí)現(xiàn)示例
這篇文章主要介紹了PyTorch 中的傅里葉卷積實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12