第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

Pandas 缺失值的處理

1. 前言

通過(guò)前面幾個(gè)小節(jié)的學(xué)習(xí),我們掌握了 Pandas 解析數(shù)據(jù)和數(shù)據(jù)增刪改查的基礎(chǔ)操作,能有效對(duì)數(shù)據(jù)的量和內(nèi)容進(jìn)行處理,但我們?cè)诮馕鰯?shù)據(jù)的時(shí)候經(jīng)常會(huì)出現(xiàn)缺失值的情況,這些缺失數(shù)據(jù)的存在不僅影響數(shù)據(jù)的美觀(guān),還會(huì)影響到數(shù)據(jù)分析和挖掘的結(jié)果,那 Pandas 庫(kù)中又是怎么解決缺失值這一問(wèn)題的呢?

針對(duì)數(shù)據(jù)中的缺失值,Pandas 庫(kù)提供了便捷的操作去檢查缺失值,并對(duì)缺失值作出處理,本小節(jié),我們將學(xué)習(xí) Pandas 檢測(cè)缺失值的方法,以及 Pandas 處理缺失值常見(jiàn)的兩種方式。

2. 缺失值的檢測(cè)

在學(xué)習(xí)進(jìn)行缺失值處理之前,我們先來(lái)看一下什么是缺失值,為什么會(huì)出現(xiàn)缺失值?

缺失值 —— 是指粗糙數(shù)據(jù)中由于缺少信息而造成的數(shù)據(jù)的聚類(lèi)、分組、刪失或截?cái)?。它指的是現(xiàn)有數(shù)據(jù)集中某個(gè)或某些屬性的值是不完全的。(來(lái)源:百度百科)

缺失值的出現(xiàn)是很正常的一種現(xiàn)象,首先我們要正視缺失值的存在,缺失值的出現(xiàn)一般來(lái)說(shuō)有機(jī)械原因和人為原因,但在我們實(shí)際應(yīng)用中,多說(shuō)是我們?nèi)藶榈氖д`或錯(cuò)誤的操作導(dǎo)致的缺失,缺失值的出現(xiàn)對(duì)于我們分析數(shù)據(jù)的過(guò)程不會(huì)產(chǎn)生過(guò)大的影響,但是對(duì)于數(shù)據(jù)分析的結(jié)果可能會(huì)產(chǎn)生致命的影響,影響數(shù)據(jù)的準(zhǔn)確性和結(jié)果的可靠性。

在 Pandas 中,對(duì)于缺失值使用浮點(diǎn)值 NaN 進(jìn)行表示,如下圖我們將 Excel 數(shù)據(jù)文件中刪除幾個(gè)數(shù)據(jù)值,進(jìn)行數(shù)據(jù)的解析:

圖片描述

然后我通過(guò) Pandas 庫(kù)進(jìn)行數(shù)據(jù)的解析,可以看到數(shù)據(jù)缺失值的表示 NaN:

圖片描述

2.1 isnull () 函數(shù)

該函數(shù)用來(lái)檢測(cè)缺失值,如果是缺失值 NaN 則數(shù)據(jù)返回的是 True,不是缺失值返回的是 False。

# 導(dǎo)入pandas包
import pandas as pd
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第11小節(jié)/execl數(shù)據(jù)demo.xlsx"
# 解析數(shù)據(jù)
data = pd.read_excel(data_path)
print(data)

# --- 輸出結(jié)果 ---
    編程語(yǔ)言   推出時(shí)間    價(jià)格            主要?jiǎng)?chuàng)始人
0    java    NaN  45.6               James Gosling
1  python  199167.0                         NaN
2     NaN  1972年   NaN  Dennis MacAlistair Ritchie
3      js    NaN   NaN                Brendan Eich
4     php  2012年   NaN              Rasmus Lerdorf
5     C++  198375.0           Bjarne Stroustrup

# 檢查是否是缺失值
data.isnull()

# --- 輸出結(jié)果 ---
   編程語(yǔ)言	  推出時(shí)間	價(jià)格	主要?jiǎng)?chuàng)始人
0	False	True	False	False
1	False	False	False	True
2	True	False	True	False
3	False	True	True	False
4	False	False	True	False
5	False	False	False	False

輸出解析:通過(guò)結(jié)果可以看到,是缺失值 NaN 的數(shù)據(jù),在該函數(shù)檢查后,都返回了 True,否則則是 False。

2.2 notnull () 函數(shù)

該函數(shù)也能檢測(cè)缺失值,但是和 isnull () 函數(shù)相反,對(duì)于缺失值 NaN 的數(shù)據(jù)返回 False,否則為 True。

# data 是上面從 Excel 中解析出來(lái)的數(shù)據(jù)
# 檢查是否不是缺失值
data.notnull()

# --- 輸出結(jié)果 ---
   編程語(yǔ)言	 推出時(shí)間   價(jià)格	主要?jiǎng)?chuàng)始人
0	True	False	True	True
1	True	True	True	False
2	False	True	False	True
3	True	False	False	True
4	True	True	False	True
5	True	True	True	True

輸出解析:通過(guò)結(jié)果可以看到,不是缺失值 NaN 的數(shù)據(jù),在該函數(shù)檢查后,都返回了 True,否則則是 False。

3. 缺失值的處理

Pandas 提供了便捷的方法去檢測(cè)缺失值,當(dāng)然他還提供了對(duì)應(yīng)的函數(shù)去處理缺失值,這里我們將學(xué)習(xí)缺失值的兩種處理方式,一種是過(guò)濾缺失值,也就對(duì)存在缺失值的行或者列,進(jìn)行過(guò)濾操作;另一種是我們對(duì)缺失的數(shù)據(jù)進(jìn)行填充處理。

3.1 dropna () 函數(shù)

該函數(shù)用于過(guò)濾含有缺失值的數(shù)據(jù)行或者列,操作之后會(huì)返回一個(gè)新的數(shù)據(jù)集,該函數(shù)提供了豐富的參數(shù)設(shè)置,下面列舉了該函數(shù)常用的幾個(gè)參數(shù):

參數(shù)名 說(shuō)明
axis 指定是行還是列的過(guò)濾( 0 指行,1 為列),默認(rèn) axis=0
how 指定缺失值過(guò)濾的依據(jù),含有缺失值就過(guò)濾(how=“any” 默認(rèn))還是全是全是缺失值才過(guò)濾(how=“all”)
thresh 指保留至少含有多少個(gè)非缺失值的行或列(參數(shù)值為整數(shù))
subset 指定特定的行或者列進(jìn)行缺失值過(guò)濾

下面我們將通過(guò)實(shí)際程序操作,學(xué)習(xí)每個(gè)參數(shù)的使用方式:

# 導(dǎo)入pandas包
import pandas as pd
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第11小節(jié)/execl數(shù)據(jù)demo.xlsx"
# 解析數(shù)據(jù)
data = pd.read_excel(data_path)
print(data)
# --- 輸出結(jié)果 ---
     編程語(yǔ)言   推出時(shí)間    價(jià)格           主要?jiǎng)?chuàng)始人
0    java    NaN  45.6               James Gosling
1  python  199167.0                         NaN
2     NaN  1972年   NaN  Dennis MacAlistair Ritchie
3      js    NaN   NaN                Brendan Eich
4     php  2012年   NaN              Rasmus Lerdorf
5     C++  198375.0           Bjarne Stroustrup

###### dropna 過(guò)濾缺失值
# 1. axis=0 設(shè)置過(guò)濾行中有缺失值的數(shù)據(jù)
new_data= data.dropna(axis=0)
print(new_data)
# --- 輸出結(jié)果 ---
  編程語(yǔ)言   推出時(shí)間    價(jià)格    主要?jiǎng)?chuàng)始人
5  C++    198375.0  Bjarne Stroustrup
# 結(jié)果解析:可以看到所有含 NaN 的數(shù)據(jù)行都被過(guò)濾掉,只剩下一行數(shù)據(jù)

# 2. axis=1 設(shè)置過(guò)濾行列中缺失值的數(shù)據(jù)
new_data= data.dropna(axis=1)
print(new_data)
# --- 輸出結(jié)果 ---
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3, 4, 5]
# 結(jié)果解析:因?yàn)樵瓟?shù)據(jù)中每一列都有 NaN 數(shù)據(jù)的存在,所以 axis=1 操作后,數(shù)據(jù)集為 Empty DataFrame

# 3. how="all" 設(shè)置所有值都為 NaN 的數(shù)據(jù)列才被過(guò)濾
new_data= data.dropna(axis=1,how="all")
print(new_data)
# --- 輸出結(jié)果 ---
    編程語(yǔ)言   推出時(shí)間    價(jià)格           主要?jiǎng)?chuàng)始人
0    java    NaN  45.6               James Gosling
1  python  199167.0                         NaN
2     NaN  1972年   NaN  Dennis MacAlistair Ritchie
3      js    NaN   NaN                Brendan Eich
4     php  2012年   NaN              Rasmus Lerdorf
5     C++  198375.0           Bjarne Stroustrup
# 結(jié)果解析:通過(guò)設(shè)置 how="all" 因?yàn)樵瓟?shù)據(jù)不存在全為 NaN 的數(shù)據(jù)列,因此并沒(méi)有進(jìn)行數(shù)據(jù)的過(guò)濾,輸出為原數(shù)據(jù)集

# 4. thresh=4 只保留含有4個(gè)及4個(gè)以上的非缺失值的數(shù)據(jù)
new_data= data.dropna(axis=1,thresh=4)
print(new_data)
# --- 輸出結(jié)果 ---
     編程語(yǔ)言   推出時(shí)間           主要?jiǎng)?chuàng)始人
0    java    NaN               James Gosling
1  python  1991年                         NaN
2     NaN  1972年  Dennis MacAlistair Ritchie
3      js    NaN                Brendan Eich
4     php  2012年              Rasmus Lerdorf
5     C++  1983年           Bjarne Stroustrup
# 結(jié)果解析:因?yàn)?價(jià)格"這一列只有3個(gè)非缺失值的數(shù)據(jù),因此設(shè)置 thresh=4,會(huì)將該列過(guò)濾掉。     

# 5. subset 指定要過(guò)濾的數(shù)據(jù)列
new_data= data.dropna(axis=0,subset=["價(jià)格","主要?jiǎng)?chuàng)始人"])
print(new_data)
# --- 輸出結(jié)果 ---
   編程語(yǔ)言   推出時(shí)間    價(jià)格   主要?jiǎng)?chuàng)始人
0  java    NaN  45.6      James Gosling
5   C++  198375.0  Bjarne Stroustrup
# 結(jié)果解析:這里通過(guò) subset 指定過(guò)濾"價(jià)格""主要?jiǎng)?chuàng)始人"列中存在 NaN 數(shù)據(jù)的行,通過(guò)結(jié)果可以看到,過(guò)濾掉了行索引為1,2,3,4的行。

3.2 fillna () 函數(shù)

該函數(shù)用于填充缺失值的操作,返回一個(gè)新的數(shù)據(jù)集,該函數(shù)提供了豐富的參數(shù)可供設(shè)置,下面列舉了常用的幾個(gè)參數(shù):

參數(shù)名 說(shuō)明
value 指定用什么值去填充
method 填充的方式,ffill 用前一個(gè)非缺失值填充這個(gè)缺失值,bfill 用下一個(gè)非缺失值填充這個(gè)缺失值,None 默認(rèn)的,指定一個(gè)缺失值去填充
axis 修改填充的方向 ,默認(rèn)是 axis=0 在列的方向填充
limit 指定填充的個(gè)數(shù),在某個(gè)方向如果存在多個(gè)連續(xù)的缺失值,指定填充的幾個(gè)

下面通代碼程序來(lái)看一個(gè)每個(gè)參數(shù)的具體使用方式:

# 導(dǎo)入pandas包
import pandas as pd
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第11小節(jié)/execl數(shù)據(jù)demo.xlsx"
# 解析數(shù)據(jù)
data = pd.read_excel(data_path)
print(data)
# --- 輸出結(jié)果 ---
     編程語(yǔ)言   推出時(shí)間    價(jià)格          主要?jiǎng)?chuàng)始人
0    java    NaN  45.6               James Gosling
1  python  199167.0                         NaN
2     NaN  1972年   NaN  Dennis MacAlistair Ritchie
3      js    NaN   NaN                Brendan Eich
4     php  2012年   NaN              Rasmus Lerdorf
5     C++  198375.0           Bjarne Stroustrup

# 1. 直接設(shè)置 value 指定填充的內(nèi)容
new_data= data.fillna("###")
print(new_data)
# --- 輸出結(jié)果 ---
     編程語(yǔ)言   推出時(shí)間    價(jià)格           主要?jiǎng)?chuàng)始人
0    java    ###  45.6               James Gosling
1  python  199167                         ###
2     ###  1972年   ###  Dennis MacAlistair Ritchie
3      js    ###   ###                Brendan Eich
4     php  2012###              Rasmus Lerdorf
5     C++  198375           Bjarne Stroustrup
# 結(jié)果解析:通過(guò)設(shè)置填充的值為 ### ,可以看到原數(shù)據(jù)集中的缺失值都被填充了該字符

# 2. 設(shè)置 method 填充的方向
new_data= data.fillna(method="bfill")
print(new_data)
# --- 輸出結(jié)果 ---
     編程語(yǔ)言   推出時(shí)間    價(jià)格           主要?jiǎng)?chuàng)始人
0    java  199145.6               James Gosling
1  python  199167.0  Dennis MacAlistair Ritchie
2      js  197275.0  Dennis MacAlistair Ritchie
3      js  201275.0                Brendan Eich
4     php  201275.0              Rasmus Lerdorf
5     C++  198375.0           Bjarne Stroustrup
# 結(jié)果解析:這里設(shè)置了填充的方式為 bfill ,默認(rèn)的 axis=0 是在列上,表示用這一列的下一行的非缺失值填充這個(gè)缺失值,通過(guò)輸出結(jié)果可看到,缺失值均被填上了內(nèi)容,這里要注意一點(diǎn),如果下一個(gè)數(shù)據(jù)為 NaN,則會(huì)繼續(xù)往下找,直到找到一個(gè)非缺失值的數(shù)據(jù)來(lái)填充。

# 3. 設(shè)置 axis=1 在橫向上進(jìn)行填充
new_data= data.fillna(axis=1,method="bfill")
print(new_data)
# --- 輸出結(jié)果 ---
     編程語(yǔ)言    推出時(shí)間                  價(jià)格                   主要?jiǎng)?chuàng)始人 
0    java          45.6                        45.6         James Gosling 
1  python         199167        NaN
2   19721972年  Dennis MacAlistair Ritchie        Dennis MacAlistair Ritchie  
3      js  Brendan Eich                Brendan Eich         Brendan Eich  
4     php         2012年              Rasmus Lerdorf        Rasmus Lerdorf
5     C++         198375        Bjarne Stroustrup  
# 結(jié)果解析:這里程序中設(shè)置了 axis 為橫向,method 為 bfill ,通過(guò)輸出結(jié)果可以看到為 NaN 的數(shù)據(jù),用他后面的非缺失值進(jìn)行了填充,如果他后面沒(méi)有數(shù)據(jù),則不進(jìn)行填充,仍然為 NaN。

# 4. limit 指定出現(xiàn)連續(xù)的缺失值,填充的數(shù)量
new_data= data.fillna(axis=0,method="bfill",limit=2)
print(new_data)
# --- 輸出結(jié)果 ---
     編程語(yǔ)言   推出時(shí)間    價(jià)格            主要?jiǎng)?chuàng)始人
0    java  199145.6               James Gosling
1  python  199167.0  Dennis MacAlistair Ritchie
2      js  1972年   NaN  Dennis MacAlistair Ritchie
3      js  201275.0                Brendan Eich
4     php  201275.0              Rasmus Lerdorf
5     C++  198375.0           Bjarne Stroustrup
# 結(jié)果解析:通過(guò)設(shè)置 limit=2 指定出現(xiàn)連續(xù)的缺失值只填充2個(gè)數(shù)據(jù),這里可以看到在"價(jià)格"列中原數(shù)據(jù)出現(xiàn)的連續(xù)三個(gè) NaN 這里按列的方向,只填充了兩個(gè)數(shù)據(jù)。

3. 小結(jié)

本節(jié)課程我們主要學(xué)習(xí)了 Pandas 檢測(cè)數(shù)據(jù)集中存在缺失值的方法,同時(shí)學(xué)習(xí)了 Pandas 對(duì)缺失值的過(guò)濾操作和填充缺失值的方法。本節(jié)課程的重點(diǎn)如下:

  • isnull () 函數(shù)和 notnull () 函數(shù)對(duì)缺失值的檢測(cè)操作和檢測(cè)返回結(jié)果;
  • dropna () 函數(shù)對(duì)缺失值的過(guò)濾操作,以及其中常用參數(shù)的設(shè)置方式;
  • fillna () 函數(shù)對(duì)缺失值的填充操作,以及其中常用參數(shù)的設(shè)置方式。

圖片描述