由於資料庫或數據集中存在大量缺失數據和空值,這時在pandas中經常用NAN代替。 pandas用標簽方法表示缺失值: 一:浮點數據類型的NaN值 二:python的None對象 其中,None是一個python對象,所以不能作為任何Numpy/pandas數組類型的缺失值,只能用於'object' ...
由於資料庫或數據集中存在大量缺失數據和空值,這時在pandas中經常用NAN代替。
pandas用標簽方法表示缺失值:
一:浮點數據類型的NaN值
二:python的None對象
其中,None是一個python對象,所以不能作為任何Numpy/pandas數組類型的缺失值,只能用於'object'數組類型(即由python對象構成的數組)
1 in:np.array([1,None,3,4]) 2 out:array([1,None,3,4],dtype=object)
而NaN屬於數值類型的缺失值,是一種按照IEEE浮點數標準設計,在任何系統中都相容的特殊浮點數。
1 in:vals1=np.array([1,np.nan,3,4]) 2 vals1.dtype 3 out:dtype('float64')
並且在數組運算中,NaN可看作是一個數據類病毒,可以把與它接觸過的數據同化,例如:
1+np.nan與1*np.nan結果均為nan,這是需要註意的。
但在實際運算中,NaN這一特性並不能讓我們得到滿意的結果,如下實例可看:
1 in:vals2=np.array([1,np.nan,3,4]) 2 vals2.sum(),vals2.min(),vals2.max() 3 out:(nan,nan,nan)
特殊的累計函數,可以忽略缺失值的影響
1 in:vals3=np.array([1,np.nan,3,4]) 2 np.nansum(vals3),np.nanmin(vals3),np.nanmax(vals3) 3 out:(8.0,1.0,4.0)
註意:這裡結果是浮點類型 dtype='float64'
NaN與None:
在pandas中它們兩個是可以等價交換的
pd.Series([1,np.nan,2,None])
out:
0 1.0
1 NaN
2 2.0
3 NaN
dtype:float64
註意:其中np.nan是強制轉換成浮點數缺失值NaN,pandas會將沒有標簽值的數據類型自動轉換為NA
轉換規則如下:
類型 | 缺失值轉換規則 | NA標簽值 |
floating浮點型 | 無變化 | np.nan |
object對象類型 | 無變化 | np.nan或None |
integer整數類型 | 強制轉換成float64 | np.nan |
Boolean布爾類型 | 強制轉換成object | np.nan或None |
關於pandas發現、剔除、替換數據結構中的缺失值
isnull(),notnull()#返回布爾類型,創建一個布爾類型的數組,isnull():若是缺失值,則返回true,否則false,而在notnull中則相反
dropna():不傳參數時,預設刪除所有含缺失值的行,若傳入axis=1或axis='columns',則它會刪除所有包含缺失值的列
以上會把一些非缺失值一併剔除,為避免這個情況發生,可通過設置how和thresh參數滿足
例如:
df.dropna(axis=1,how='all')則是刪除全部為缺失值的列
df.dropna(axis='rows',thresh=2)則刪除的行中非缺失值至少為2個,thresh用於設置行或列中非缺失值的最小數量
fillna()用於填充缺失值,將其換成有效數值
(可返回填充了缺失值的數組副本)
在Series中
df.fillna(0) 用0來替換缺失值
1 in:df=pd.Series([1,2,np.nan,4,5]) 2 df.fillna(0) 3 out: 4 0 1.0 5 1 2.0 6 2 0.0 7 3 4.0 8 4 5.0 9 dtype:float64
df.fillna(method='ffill') 從前往後填充
1 in:df=pd.Series([1,2,np.nan,4,5]) 2 df.fillna(method='ffill') 3 out: 4 0 1.0 5 1 2.0 6 2 2.0 7 3 4.0 8 4 5.0 9 dtype:float64
df.fillna(method='bfill') 從後往前填充
1 in:df=pd.Series([1,2,np.nan,4,5]) 2 df.fillna(method='bfill') 3 out: 4 0 1.0 5 1 2.0 6 2 4.0 7 3 4.0 8 4 5.0 9 dtype:float64
在DataFrame中
df.fillna(method='ffill',axis=1)與series用法類似,但需表明行或列
1 in:df=pd.DataFrame([[1,2,np.nan],[3,6,7],[4,np.nan,np.nan]],columns=['a','b','c']) 2 df.fillna(method='ffill',axis=0) 3 out: 4 a b c 5 0 1.0 2.0 2.0 6 1 3.0 6.0 7.0 7 2 4.0 4.0 4.0 8 dtype:float64