NAN和INF值處理


NAN和INF值處理

首先我們要知道這兩個英文單詞代表的什么意思:

  1. NANNot A number,不是一個數字的意思,但是他是屬於浮點類型的,所以想要進行數據操作的時候需要注意他的類型。
  2. INFInfinity,代表的是無窮大的意思,也是屬於浮點類型。np.inf表示正無窮大,-np.inf表示負無窮大,一般在出現除數為0的時候為無窮大。比如2/0

NAN一些特點:

  1. NAN和NAN不相等。比如np.NAN != np.NAN這個條件是成立的。
  2. NAN和任何值做運算,結果都是NAN。

有些時候,特別是從文件中讀取數據的時候,經常會出現一些缺失值。缺失值的出現會影響數據的處理。因此我們在做數據分析之前,先要對缺失值進行一些處理。處理的方式有多種,需要根據實際情況來做。一般有兩種處理方式:刪除缺失值,用其他值進行填充。

刪除缺失值:

有時候,我們想要將數組中的NAN刪掉,那么我們可以換一種思路,就是只提取不為NAN的值。示例代碼如下:

# 1. 刪除所有NAN的值,因為刪除了值后數組將不知道該怎么變化,所以會被變成一維數組
data = np.random.randint(0,10,size=(3,5)).astype(np.float)
data[0,1] = np.nan
data = data[~np.isnan(data)] # 此時的data會沒有nan,並且變成一個1維數組

# 2. 刪除NAN所在的行
data = np.random.randint(0,10,size=(3,5)).astype(np.float)
# 將第(0,1)和(1,2)兩個值設置為NAN
data[[0,1],[1,2]] = np.NAN
# 獲取哪些行有NAN
lines = np.where(np.isnan(data))[0]
# 使用delete方法刪除指定的行,axis=0表示刪除行,lines表示刪除的行號
data1 = np.delete(data,lines,axis=0)

用其他值進行替代:

有些時候我們不想直接刪掉,比如有一個成績表,分別是數學和英語,但是因為某個人在某個科目上沒有成績,那么此時就會出現NAN的情況,這時候就不能直接刪掉了,就可以使用某些值進行替代。假如有以下表格:

數學 英語
59 89
90 32
78 45
34 NAN
NAN 56
23 56

如果想要求每門成績的總分,以及每門成績的平均分,那么就可以采用某些值替代。比如求總分,那么就可以把NAN替換成0,如果想要求平均分,那么就可以把NAN替換成其他值的平均值。示例代碼如下:

scores = np.loadtxt("nan_scores.csv",skiprows=1,delimiter=",",encoding="utf-8",dtype=np.str)
scores[scores == ""] = np.NAN
scores = scores.astype(np.float)
# 1. 求出學生成績的總分
scores1 = scores.copy()
socres1.sum(axis=1)

# 2. 求出每門成績的平均分
scores2 = scores.copy()
for x in range(scores2.shape[1]):
    score = scores2[:,x]
    non_nan_score = score[score == score]
    score[score != score] = non_nan_score.mean()
print(scores2.mean(axis=0))
scores = np.loadtxt("nan_scores.csv",delimiter=",",skiprows=1,encoding="utf-8",dtype=np.str)
scores[scores == ""] = np.NAN
scores1 = scores.astype(np.float)
scores1[np.isnan(scores1)] = 0
# 除了delete用axis=0表示行以外,其他的大部分函數都是axis=1來表示行。
scores1.sum(axis=1)

輸出:

array([148. , 122. , 123.5,  34. ,  56. ,  79. ])
scores2 = scores.astype(np.float)
for x in range(scores2.shape[1]):
    col = scores2[:,x]
    non_nan_col = col[~np.isnan(col)]
    mean = non_nan_col.mean()
    col[np.isnan(col)] = mean
scores2

輸出:

array([[59. , 89. ],
       [90. , 32. ],
       [78. , 45.5],
       [34. , 55.7],
       [56.8, 56. ],
       [23. , 56. ]])

總結:

1、 NAN:Not A Number的簡寫,不是一個數字,但是他是屬於浮點類型。

2、INF:無窮大,在除數為0的情況下會出現INF。

3、NAN和所有的值進行計算結果都是等於NAN

4、NAN != NAN

5、可以通過np.isnan來判斷某個值是不是NAN。

6、處理值的時候,可以通過刪除NAN的形式進行處理,也可以通過值的替換進行處理。

7、np.delete比較特殊,他通過axis=0來代表行,而其他大部分函數是通過axis=1來代表行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM