pandas之缺失值處理
在一些資料分析業務中,資料缺失是我們經常遇見的問題,缺失值會導致資料質量的下降,從而影響模型預測的準確性,這對於機器學習和資料探勘影響尤為嚴重。因此妥善的處理缺失值能夠使模型預測更為準確和有效。
為什麼會存在缺失值?
前面章節的示例中,我們遇到過很多 NaN 值,關於缺失值您可能會有很多疑問,資料為什麼會丟失資料呢,又是從什麼時候丟失的呢?通過下面場景,您會得到答案。
其實在很多時候,人們往往不願意過多透露自己的資訊。假如您正在對使用者的產品體驗做調查,在這個過程中您會發現,一些使用者很樂意分享自己使用產品的體驗,但他是不願意透露自己的姓名和聯絡方式;還有一些使用者願意分享他們使用產品的全部經過,包括自己的姓名和聯絡方式。因此,總有一些資料會因為某些不可抗力的因素丟失,這種情況在現實生活中會經常遇到。
什麼是稀疏資料?
稀疏資料,指的是在資料庫或者資料集中存在大量缺失資料或者空值,我們把這樣的資料集稱為稀疏資料集。稀疏資料不是無效資料,只不過是資訊不全而已,只要通過適當的方法就可以“變廢為寶”。
稀疏資料的來源與產生原因有很多種,大致歸為以下幾種:
- 由於調查不當產生的稀疏資料;
- 由於天然限制產生的稀疏資料;
- 文字挖掘中產生的稀疏資料。
缺失值處理
那麼 Pandas 是如何處理缺失值的呢,下面讓我們一起看一下。
- import pandas as pd
- import numpy as np
- df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f','h'])
- df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
- print(df)
輸出結果:
0 1 2 a 0.187208 -0.951407 0.316340 b NaN NaN NaN c -0.365741 -1.983977 -1.052170 d NaN NaN NaN e -1.024180 1.550515 0.317156 f -0.799921 -0.686590 1.383229 g NaN NaN NaN h -0.207958 0.426733 -0.325951
上述示例,通過使用 reindex(重構索引),我們建立了一個存在缺少值的 DataFrame 物件。
檢查缺失值
為了使檢測缺失值變得更容易,Pandas 提供了 isnull() 和 notnull() 兩個函式,它們同時適用於 Series 和 DataFrame 物件。
- import pandas as pd
- import numpy as np
- df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f','h'])
- df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
- print(df['noe'].isnull())
輸出結果:
a False b True c False d True e False f False g True h False Name: 1, dtype: bool
notnull() 函式,使用示例:
- import pandas as pd
- import numpy as np
- df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f','h'])
- df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
- print df['one'].notnull()
輸出結果:
a True b False c True d False e True f True g False h True Name: 1, dtype: bool
缺失資料計算
計算缺失資料時,需要注意兩點:首先資料求和時,將 NA 值視為 0 ,其次,如果要計算的資料為 NA,那麼結果就是 NA。示例如下:
- import pandas as pd
- import numpy as np
- df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f','h'],columns=['one', 'two', 'three'])
- df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
- print (df['one'].sum())
- print()
輸出結果:
3.4516595395128
清理並填充缺失值
Pandas 提供了多種方法來清除缺失值。fillna() 函式可以實現用非空資料“填充”NaN 值。
1) 用標量值替換NaN值
下列程式將 NaN 值 替換為了 0,如下所示:
- import pandas as pd
- import numpy as np
- df = pd.DataFrame(np.random.randn(3, 3), index=['a', 'c', 'e'],columns=['one',
- 'two', 'three'])
- df = df.reindex(['a', 'b', 'c'])
- print(df)
- #用 0 填充 NaN
- print (df.fillna(0))
輸出結果:
one two three a 1.497185 -0.703897 -0.050513 b NaN NaN NaN c 2.008315 1.342690 -0.255855 one two three a 1.497185 -0.703897 -0.050513 b 0.000000 0.000000 0.000000 c 2.008315 1.342690 -0.255855
當然根據您自己的需求,您也可以用其他值進行填充。
2) 向前和向後填充NA
在《Pandas reindex重建索引》一節,我們介紹了 ffill() 向前填充和 bfill() 向後填充,使用這兩個函式也可以處理 NA 值。示例如下:
- import pandas as pd
- import numpy as np
- df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f','h'],columns=['one', 'two', 'three'])
- df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
- print df.fillna(method='ffill')
輸出結果:
one two three a 0.871741 0.311057 0.091005 b 0.871741 0.311057 0.091005 c 0.107345 -0.662864 0.826716 d 0.107345 -0.662864 0.826716 e 1.630221 0.482504 -0.728767 f 1.283206 -0.145178 0.109155 g 1.283206 -0.145178 0.109155 h 0.222176 0.886768 0.347820
或者您也可以採用向後填充的方法。
3) 使用replace替換通用值
在某些情況下,您需要使用 replace() 將 DataFrame 中的通用值替換成特定值,這和使用 fillna() 函式替換 NaN 值是類似的。示例如下:
- import pandas as pd
- import numpy as np
- df = pd.DataFrame({'one':[10,20,30,40,50,666], 'two':[99,0,30,40,50,60]})
- #使用replace()方法
- print (df.replace({99:10,666:60,0:20}))
輸出結果:
one two 0 10 10 1 20 20 2 30 30 3 40 40 4 50 50 5 60 60
刪除缺失值
如果想刪除缺失值,那麼使用 dropna() 函式與引數 axis 可以實現。在預設情況下,按照 axis=0 來按行處理,這意味著如果某一行中存在 NaN 值將會刪除整行資料。示例如下:
- import pandas as pd
- import numpy as np
- df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f','h'],columns=['one', 'two', 'three'])
- df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
- print(df)
- #刪除缺失值
- print (df.dropna())
輸出結果:
one two three a -2.025435 0.617616 0.862096 b NaN NaN NaN c -1.710705 1.780539 -2.313227 d NaN NaN NaN e -2.347188 -0.498857 -1.070605 f -0.159588 1.205773 -0.046752 g NaN NaN NaN h -0.549372 -1.740350 0.444356 one two three a -2.025435 0.617616 0.862096 c -1.710705 1.780539 -2.313227 e -2.347188 -0.498857 -1.070605 f -0.159588 1.205773 -0.046752 h -0.549372 -1.740350 0.444356
axis = 1 表示按列處理,處理結果是一個空的 DataFrame 物件。