1.空值
- None: Python自帶的數據類型 不能參與到任何計算中
- np.nan: float類型 能參與計算,但結果總是nan
# None+2 # 報錯 # np.nan + 2 # 值仍然是nan
1.2 np.nan(NaN)
數組直接運算會得到nan,但可以使用np.nansum()函數來計算nan,此時視nan為0。
ndarr = np.array([1,2,3,np.nan])
np.sum(ndarr)
np.nansum(ndarr)
Series和DataForm可以直接處理nan
s1 = Series([1,2,3,np.nan])
s1
0 1.0
1 2.0
2 3.0
3 NaN dtype: float64 s1.sum() 6.0
df1 = DataFrame([1,2,3,np.nan])
df1
df1.sum()
0 6.0 dtype: float64
1.3 pandas中的None與NaN
s1 = Series([1,2,3,np.nan,None]) #
s1 0 1.0 1 2.0 2 3.0 3 NaN 4 NaN dtype: float64
df1 = DataFrame([1,2,3,np.nan,None]) # Series和DataFrame都會自動把None轉換成NaN 然后 運算的時候會把NaN當成0 df1
2. 空值檢測與空值處理
isnull()
notnull()
dropna()
: 過濾丟失數據fillna()
: 填充丟失數據
isnull()
notnull()
用randint創建一個5*5的DataFrame作為例子
df = DataFrame(data=np.random.randint(0,100,size=(5,5)),columns=list('abcde')) df.loc[1,'a'] = np.nan df.loc[3,'b'] = np.nan df.loc[0,'e'] = np.nan
isnull配合any使用,可以查看每一行是否存在空值
可以控制axis改變方向,查看某一列是否存在空值
dropna()
可以選擇過濾的是行還是列(默認為行)
df.dropna() # 默認 保留沒有空值的行
也可以選擇過濾的方式 how = 'all',代表全部為空則刪除
2.3 空值填充¶
fillna()
# value=None 默認情況
df.fillna(value=50)
也可以選擇從前面找值來填充還是從后面找值來填充
# method指的是 如何對空值進行填充
# 'bfill'從后面找值來填充 ffill從前面找值來填充
# df.fillna(method='bfill')
# df.fillna(method='ffill') # 默認是縱向(從相鄰樣本的 同一特征中找值)
# df.fillna(method='bfill',axis=0) # 豎向
df.fillna(method='bfill',axis=1) # 橫向
還可以限定最多填充幾個連續的NaN
df.fillna(method='bfill',limit=1,inplace=True) # 用來限制填充多少個
fillna()方法總結:
# value=None, method=None, axis=None, inplace=False, limit=None # value直接指定 用什么值來填充 # method 指定填充方法 # axis 指定填充值的方向 # inplace 指的是是否對原df進行替換 # limit 限制填充的個數 df.fillna()