只要和數(shù)據(jù)打交道,就不可能不面對一個令人頭疼的問題-數(shù)據(jù)集中存在空值??罩堤幚?,是數(shù)據(jù)預處理之數(shù)據(jù)清洗的重要內(nèi)容之一。本篇文章更加細致的討論一下空值在Pandas中的判斷和處理。
#### pandas對空值的表現(xiàn)
首先我們有三張表格:
在jupyter notebook中我們讀取數(shù)據(jù)如下:
通過對比我們發(fā)現(xiàn):
> 1. 不加入空格時,序號列被讀為float型,出生日期列被讀為datetime64型,而加入了空格后,統(tǒng)一解讀為object型。
>
> 2. 不加入空格時,序號列和姓名列中的缺失值默認為NaN,而時間則為NaT,而加了空格后,缺失值統(tǒng)一為NaN。
> 3. 當時間識別為datetime64類型時,其格式就是輸入的格式,但其識別為字符串時,格式會統(tǒng)一加上時分秒。
#### 判斷缺失值
缺失值:在DataFrame中讀出數(shù)據(jù)顯示為NaN或者NaT(缺失時間),在Series中為None或者NaN均可。
快速確認數(shù)據(jù)集中是不是存在缺失值。有兩個函數(shù) **isnull, isna**,這兩個函數(shù)可以幫助我們快速定位數(shù)據(jù)集中每個元素是否為缺失值。
##### isna(isnull)的使用:
先說一下被問過很多次的問題,就是isna和isnull的區(qū)別?我們看一下如下代碼:
說明其實這兩個是一個函數(shù),isnull就是isna。ok明白了嗎?
下面我們看如何使用isna,以上面的表格數(shù)據(jù)為例:
查看所有列的缺失值情況
```
import pandas as pd
ts2 = pd.read_excel('table1.xlsx',sheet_name='Sheet2',encoding='gbk') # 注意編碼設置根據(jù)情況設置也可以省略
pd.isna(ts2) # 或者ts2.isna()
```
結果:
查看某一列的缺失值情況
```
pd.isna(ts2['出生日期']) # ts2['出生日期'].isna()
```找出出生日期有缺失值的行,當然也可以是其他的列名
```
ts2[ts2['出生日期'].isna()]
```
#### 缺失值處理
對缺失值的處理主要有兩種方式:
> 1. 填充
>
> 2. 刪除
##### 缺失值填充
缺失值的填充我們使用:fillna。
> **DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)**
>
> **函數(shù)作用:填充缺失值**
value: 需要用什么值去填充缺失值
axis: 確定填充維度,從行開始或是從列開始
method:ffill:用缺失值前面的一個值代替缺失值,如果axis =1,那么就是橫向的前面的值替換后面的缺失值,如果axis=0,那么則是上面的值替換下面的缺失值。backfill/bfill,缺失值后面的一個值代替前面的缺失值。注意這個參數(shù)不能與value同時出現(xiàn)
limit:確定填充的個數(shù),如果limit=2,則只填充兩個缺失值。
```
# 仍然是上面的數(shù)據(jù):Sheet1
ts1 = pd.read_excel('table1.xlsx',sheet_name='Sheet1')
ts1.fillna(axis=0,method='bfill')
ts1.fillna(axis=0,method='ffill')
ts1.fillna(axis=1,method='bfill') # 當前axis=1沒有太大意義,還破壞了結構
```
也可以使用fillna(固定value)填充所有或者填充某列內(nèi)容
如果加上limit參數(shù)就會對每列出現(xiàn)的替換值有次數(shù)限制。
##### 缺失值刪除
> DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
>
> 函數(shù)作用:刪除含有空值的行或列
>
axis:維度,axis=0表示index行,axis=1表示columns列,默認為0
how: "all"表示這一行或列中的元素全部缺失(為NaN)才刪除這一行或列,"any"表示這一行或列中只要有元素缺失,就刪除這一行或列
thresh: 一行或一列中至少出現(xiàn)了thresh個才刪除。
subset:在某些列的子集中選擇出現(xiàn)了缺失值的列刪除,不在子集中的含有缺失值得列或行不會刪除(有axis決定是行還是列)
inplace:刷選過缺失值得新數(shù)據(jù)是存為副本還是直接在原數(shù)據(jù)上進行修改。
注意一下inplace參數(shù),inplace默認為False是返回新的數(shù)據(jù)集,而如果inplace為True則表示在原數(shù)據(jù)集上操作。
更多關于“Python 培訓”的問題,歡迎咨詢千鋒教育在線名師。千鋒教育多年辦學,課程大綱緊跟企業(yè)需求,更科學更嚴謹,每年培養(yǎng)泛IT人才近2萬人。不論你是零基礎還是想提升,都可以找到適合的班型,千鋒教育隨時歡迎你來試聽