處理丟失數據
有兩種丟失的數據:
-- None
-- np.nan(NaN)
1.None
None是Python自帶的,其類型爲python object。因此,None不能參與到任何計算中
object類型的運算要比int類型的運算慢得多
2.np.nan(NaN)
np.nan是浮點類型,能參與到計算中。但計算的結果總是NaN
但可以使用np.nan() 函數來計算nan,此時視nan爲 3.pandas中的None與NaN (1) pandas中None與np.nan都視作np.nan
(1) 判斷函數:
df.isnull() df.isnull.any() df.isnull.all() df.notnull() df.notnull.any() df.notnull.all()
'''具體的代碼實例以及功能如下:'''
from pandas import DataFrame, Series import numpy as np df = DataFrame({"age": [20, 21, 19, 22, 23], 'salary': [10000, 11000, 9900, 8500, 15000]}, index=['張三', '李四', '小趙', '小王', '小馮'], columns=['age', 'salary', 'work']) # 插入數據 df.work['李四':'小王'] = 'python' print(df) """ age salary work 張三 20 10000 NaN 李四 21 11000 python 小趙 19 9900 python 小王 22 8500 python 小馮 23 15000 NaN """ '''1.調用isnull()方法,判斷是否爲空''' print(df.isnull()) """ age salary work 張三 False False True 李四 False False False 小趙 False False False 小王 False False False 小馮 False False True """ '''2. isnull().any() 只有數據有一個爲空,即爲True any(axis=0):只要數據有一個爲True就爲這“列”就爲True any(axis=1):只要數據有一個爲True就爲這“行”就爲True''' s1 = df.isnull().any(axis=1) '''(獲取數據爲空的數據)把獲得的Series在使用DataFrame取值''' print(df[s1]) """ age salary work 張三 20 10000 NaN 小馮 23 15000 NaN """ '''3.isnull().all() 數據全部爲空時,才爲True,axis同any()''' print(df.isnull().all(axis=1)) """ 張三 False 李四 False 小趙 False 小王 False 小馮 False dtype: bool """ '''4.notnull() 判斷數據是否不爲空''' print(df.notnull()) """ age salary work 張三 True True False 李四 True True True 小趙 True True True 小王 True True True 小馮 True True False """ ''' 5notnull().any() 只有數據有一個不爲空,即爲True any(axis=0):只要數據有一個不爲True就爲這“列”就爲True any(axis=1):只要數據有一個不爲True就爲這“行”就爲True''' print(df.notnull().any(axis=1)) """ 張三 True 李四 True 小趙 True 小王 True 小馮 True dtype: bool """ '''6.notnull().all() 數據全部不爲空時,才爲True,axis同any()''' s2 = df.notnull().all(axis=1) print(s2) """ 張三 False 李四 True 小趙 True 小王 True 小馮 False dtype: bool """ '''取出沒有一個空值的數據''' print(df[s2]) """ age salary work 李四 21 11000 python 小趙 19 9900 python 小王 22 8500 python """
(2) 過濾函數
· dropna() 可以選擇過濾的是行還是列(默認爲行) , 也可以選擇過濾的方式 參數 :how='all'
'''dropna(),中的參數axis默認爲0,即爲行''' '''一行數據只要有一個爲空就進行刪除,如果加上參數how='all'代表一行都爲空時才刪除''' print(df.dropna()) """ age salary work 李四 21 11000 python 小趙 19 9900 python 小王 22 8500 python """ '''一列數據只要有一個爲空就進行刪除,參數how='all'代表一列都爲空時才刪除''' print(df.dropna(axis=1)) """ age salary 張三 20 10000 李四 21 11000 小趙 19 9900 小王 22 8500 小馮 23 15000 """
(3) 填充函數 Series/DataFrame
-- fillna() 參數value='' 即爲要填充的值
method:對應的值 'bfill'(選擇後面的填充)或者'ffill(選擇前面的填充)
inplace:True 是否選擇在原來的基礎上修改,加上該參數沒有返回值
'''fillna() 填充所有的空值''' print(df.fillna(value="填充值")) """ age salary work 張三 20 10000 填充值 李四 21 11000 python 小趙 19 9900 python 小王 22 8500 python 小馮 23 15000 填充值 """ '''可以選擇向前填充還是向後填充 參數method:對應的值 'bfill'(選擇後面的填充)或者'ffill(選擇前面的填充) inplace:True 是否選擇在原來的基礎上修改,沒有返回值 對於DataFrame來說,選擇填充的軸axis. -- axis=0 index/行 -- axis=1 columns/列''' print(df.fillna(method='bfill')) """ # 因爲最後一個後面沒有值,所以最後一個填充還是爲NaN age salary work 張三 20 10000 python 李四 21 11000 python 小趙 19 9900 python 小王 22 8500 python 小馮 23 15000 NaN """ print(df.fillna(method='ffill')) """ # 因爲第一個的前沒有值,所以第一個填充還是NaN age salary work 張三 20 10000 NaN 李四 21 11000 python 小趙 19 9900 python 小王 22 8500 python 小馮 23 15000 python """