NAN和INF值處理
首先我們要知道這兩個英文單詞代表的什么意思:
NAN
:Not A number
,不是一個數字的意思,但是他是屬於浮點類型的,所以想要進行數據操作的時候需要注意他的類型。INF
:Infinity
,代表的是無窮大的意思,也是屬於浮點類型。np.inf
表示正無窮大,-np.inf
表示負無窮大,一般在出現除數為0的時候為無窮大。比如2/0
。
NAN一些特點:
- NAN和NAN不相等。比如
np.NAN != np.NAN
這個條件是成立的。 - 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來代表行。