一、缺失值
1 缺失值類型
- 空值:在pandas中的空值是:" ",空的字符串,不是缺失值。
- 缺失值:pandas里,如果是DataFrame(數據幀)中,缺失值可以表示為NaN或者NaT(缺失時間)。可以用 Numpy的np.NaN/np.nan直接定義賦值缺失值。
- NaN 是浮點型
- 針對數值為 0 的情況,需要進行實際的分析,回歸到原始數據中去,判斷該數據為 0 時是否具有實際意義。如果沒有就將其作為缺失值做刪除處理。
- 針對數據為空值的情況,如果該特征數據缺失情況低於10%,則結合該特征的重要性進行綜合判斷。如果字段重要性較低,則考慮直接刪除,如果字段重要性較高,則進行插值法或者采用簡單填充法。
2 缺失值的認定
- 元素級別缺失判定
# 返回true/false bool型DataFrame 或者 Series
df.notna() / df.notnull() # 不是缺失為True,缺失=False
df.isna() / df.isnull() # 是缺失=True,不是缺失=False
df.col.notna() / df.col.isna() df['col'].notnull() / df['col'].isnull()# 支持Series
- 列/行級別缺失判定
# 返回 bool型Series
df.isnull().any() # 列只要有一個缺失=True
df.isna().any(1) # 行只要有一個缺失=True
df.isnull().any().any() # 表級別判斷
3 查看缺失情況
df.info() # 直接查看信息
df.isnull().sum() # 每列有多少個缺失值
df.isna().sum(1) # 每行有多少個缺失值
df.isna().sum().sum() # 總共有幾個缺失值
df.count() # 統計列的非NaN個數
df.loc[:,df.isna().any()] # 返回有缺失的列(行全要,列只要為True的)
df.loc[df.isna().any(1)] # 返回有缺失的行
df.loc[~(df.isna().any(1))] # 返回沒有缺失的行
4 處理方法(1)——缺失值填充
簡單填充df.fillna()
df.fillna(value=None, method=None, axis=None,
inplace=False, limit=None, downcast=None, **kwargs)
功能說明:
Fill NA/NaN values using the specified method。
參數說明:
- value:需要用什么值去填充缺失值,可以是scalar, dict(設置每列用不同值填), Series, or DataFrame;
- method:設置填充的方式。pad / ffill:向前填充;backfill / bfill:向后填充;
注意:假如設置method方式,就不需要傳入value參數了。還要注意軸向axis的方向。
一般軸向axis都為0(豎向填充),橫向填充沒啥意義。 - axis:{0 or 'index'(豎向填充), 1 or 'columns'(橫向填充)};
- inplace:是否修改原df,修改(True)時,返回值為None;
- limit:限定填充個數。默認為None,表示填完。
注意:當指定method、axis、limit,此時limit限定方向填充的個數,不一定缺失值填完;
當傳入value、limit時,axis參數不起作用,只能按列向下填充limit個缺失值。 - downcast:向下投射數據類型,一般不用設置,Python自動轉換。
df.fillna(0) # 傳入標量0,用0填充所有缺失值
# 每列向下填充2個缺省值,axis參數不起作用
df.fillna(value=1,axis=0,limit=2)
# df.fillna(value=0,axis=1,limit=2)
# 傳入dict,每列分別用不同的值填充
df.fillna(value={'A': 0, 'B': 1, 'C': 2, 'D': 3})
# 用前一個值向前填充缺省值,限制填充個數為1,默認軸向為0(豎向填充)
df.fillna(method='ffill',limit=1)
# 用各自列的均值填充,假如該列可以計算均值的話
df.fillna(df.mean())
# 只對A列且用A列的均值填充缺省值
df.fillna({'A': df.mean()['A']})
插值法填充
Series 和 DataFrame 對象都有interpolate()方法,默認情況下,該函數在缺失值處執行線性插值。這個方法是利用數學方法來估計缺失點的值,對於較大的數據非常有用。
(待查補充)
5 處理方法(2)——直接刪除
df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
功能說明:
刪除含有空值的行或列。
參數說明:
- axis:維度,axis=0表示index行,axis=1表示columns列,默認為0;
- how:"all"表示這一行或列中的元素全部缺失(為nan)才刪除這一行或列,"any"表示這一行或列中只要有元素缺失,就刪除這一行或列,默認為any;
- thresh:axis中至少有thresh個非缺失值,否則刪除;
- subset:[col1,...,coln],根據某n列判斷是否有缺失刪除行;[row1,...,rown],根據某n行判斷是否有缺失刪除列。判斷時,只要其中有1列/行有缺失值就刪除;
- inplace:是否修改原df,修改(True)時,返回值為None。
df.dropna() # 行只要有一個缺失值,就刪除該行
df.dropna(axis=1) # 列只要有一個缺失值,就刪除該列(謹慎使用!)
df.dropna(how='all',axis=1) # 列都缺失時,才刪除該列
df.dropna(thresh=3) # 行至少有3個非缺失值才不刪除
df.dropna(axis=1,subset=[3,4]) # 根據index為3和4的行,判斷列是否刪除
df.dropna(subset=["col_1","col_3"]) # 根據columns為"col_1"和"col_3"的列,判斷行是否刪除
df.col.dropna() # 指定列的缺失值刪除