在Pandas中處理NaN值的方法
關(guān)于NaN值
-在能夠使用大型數(shù)據(jù)集訓(xùn)練學(xué)習(xí)算法之前,我們通常需要先清理數(shù)據(jù), 也就是說,我們需要通過某個方法檢測并更正數(shù)據(jù)中的錯誤。
- 任何給定數(shù)據(jù)集可能會出現(xiàn)各種糟糕的數(shù)據(jù),例如離群值或不正確的值,但是我們幾乎始終會遇到的糟糕數(shù)據(jù)類型是缺少值。
- Pandas 會為缺少的值分配 NaN 值。
創(chuàng)建一個具有NaN值得 Data Frame
import pandas as pd # We create a list of Python dictionaries # 創(chuàng)建一個字典列表 items2 = [{'bikes': 20, 'pants': 30, 'watches': 35, 'shirts': 15, 'shoes':8, 'suits':45}, {'watches': 10, 'glasses': 50, 'bikes': 15, 'pants':5, 'shirts': 2, 'shoes':5, 'suits':7}, {'bikes': 20, 'pants': 30, 'watches': 35, 'glasses': 4, 'shoes':10}] # 創(chuàng)建一個DataFrame并設(shè)置行索引 store_items = pd.DataFrame(items2, index = ['store 1', 'store 2', 'store 3']) # 顯示 store_items
顯示:
數(shù)據(jù)量大時統(tǒng)計NaN的個數(shù)
# 計算在store_items中NaN值的個數(shù) x = store_items.isnull().sum().sum() # 輸出 print('在我們DataFrame中NaN的數(shù)量:', x)
輸出:
在我們DataFrame中NaN的數(shù)量: 3
.isnull()
方法返回一個大小和 store_items 一樣的布爾型 DataFrame,并用 True
表示具有 NaN 值的元素,用 False
表示非 NaN 值的元素。
store_items.isnull()
顯示:
在 Pandas 中,邏輯值 True 的數(shù)字值是 1,邏輯值 False 的數(shù)字值是 0。
因此,我們可以通過數(shù)邏輯值 True 的數(shù)量數(shù)出 NaN 值的數(shù)量。
為了數(shù)邏輯值 True 的總數(shù),我們使用 .sum() 方法兩次。
要使用該方法兩次,是因?yàn)榈谝粋€ sum()
返回一個 Pandas Series,其中存儲了列上的邏輯值 True
的總數(shù)
第二個 sum()
將上述 Pandas Series 中的 1 相加
除了數(shù) NaN 值的數(shù)量之外,我們還可以采用相反的方式,我們可以數(shù)非 NaN 值的數(shù)量。為此,我們可以使用 .count()
方法
print('在我們DataFrame的列中具有非NaN值得數(shù)量分別為:\n', store_items.count())
輸出:
在我們DataFrame的列中具有非NaN值得數(shù)量:
bikes 3
glasses 2
pants 3
shirts 2
shoes 3
suits 2
watches 3
dtype: int64
處理這些 NaN 值
- 如果 axis = 0,.dropna(axis) 方法將刪除包含 NaN 值的任何行
- 如果 axis = 1,.dropna(axis) 方法將刪除包含 NaN 值的任何列
# 刪除包含NaN值得任何行 store_items.dropna(axis = 0)
顯示為:
store_items.dropna(axis = 1)
顯示為:
注意:
- .dropna()
方法不在原地地刪除具有 NaN 值的行或列。
- 原始 DataFrame 不會改變。你始終可以在 dropna()
方法中將關(guān)鍵字 inplace
設(shè)為 True
,在原地刪除目標(biāo)行或列。
將NaN值替換為合適的值
我們不再刪除 NaN 值,而是將它們替換為合適的值。例如,我們可以選擇將所有 NaN 值替換為 0。為此,我們可以使用 .fillna()
方法
store_items.fillna(0)
顯示:
我們還可以使用 .fillna()
方法將 NaN 值替換為 DataFrame 中的上個值,稱之為前向填充
.fillna(method = 'ffill', axis)
將通過前向填充 (ffill) 方法沿著給定 axis 使用上個已知值替換 NaN 值
store_items.fillna(method = 'ffill', axis = 0)
顯示:
注意 store 3 中的兩個 NaN 值被替換成了它們所在列中的上個值。
但是注意, store 1 中的 NaN 值沒有被替換掉。因?yàn)檫@列前面沒有值,因?yàn)?NaN 值是該列的第一個值。
現(xiàn)在,使用上個行值進(jìn)行前向填充
store_items.fillna(method = 'ffill', axis = 1)
顯示:
在這種情況下:所有 NaN 值都被替換成了之前的行值
同時,也可以選擇用 DataFrame 中之后的值替換 NaN 值,稱之為后向填充
# 向后填充列,即為NaN的列值,用其列中的后一個來填充 store_items.fillna(method = 'backfill', axis = 0)
同理:也可以向后填充行,即為NaN的行值,用其行中的后一個來填充
# 向后填充行,即為NaN的行值,用其行中的后一個來填充 store_items.fillna(method = 'backfill', axis = 1)
注意:.fillna()
方法不在原地地替換(填充)NaN 值。也就是說,原始 DataFrame 不會改變。你始終可以在 fillna()
函數(shù)中將關(guān)鍵字 inplace
設(shè)為 True
,在原地替換 NaN
值。
還可以選擇使用不同的插值方法替換 NaN 值
.interpolate(method = 'linear', axis)
方法將通過 linear 插值使用沿著給定 axis 的值替換 NaN 值, 這個差值也就是前后或者上下的中間值
store_items.interpolate(method = 'linear', axis = 0)
同時,也可用行值插入
store_items.interpolate(method = 'linear', axis = 1)
和我們看到的其他方法一樣,.interpolate()
方法不在原地地替換 NaN 值,圖片就省略了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
dataframe設(shè)置兩個條件取值的實(shí)例
下面小編就為大家分享一篇dataframe設(shè)置兩個條件取值的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04python用opencv批量截取圖像指定區(qū)域的方法
今天小編就為大家分享一篇python用opencv批量截取圖像指定區(qū)域的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01Python urllib模塊urlopen()與urlretrieve()詳解
Python urllib模塊urlopen()與urlretrieve()的使用方法詳解。2013-11-11探索Python數(shù)據(jù)可視化庫中Plotly Express的使用方法
在數(shù)據(jù)分析和可視化領(lǐng)域,數(shù)據(jù)的有效呈現(xiàn)是至關(guān)重要的,python作為一種強(qiáng)大的編程語言,提供了多種數(shù)據(jù)可視化工具和庫,本文將介紹Plotly Express的基本概念和使用方法,幫助讀者快速入門并掌握數(shù)據(jù)可視化的技巧2023-06-06