pandas(12):數據清洗(缺失值)


一、缺失值

1 缺失值類型

  • 空值:在pandas中的空值是:" ",空的字符串,不是缺失值。
  • 缺失值:pandas里,如果是DataFrame(數據幀)中,缺失值可以表示為NaN或者NaT(缺失時間)。可以用 Numpy的np.NaN/np.nan直接定義賦值缺失值。
  • NaN 是浮點型
  1. 針對數值為 0 的情況,需要進行實際的分析,回歸到原始數據中去,判斷該數據為 0 時是否具有實際意義。如果沒有就將其作為缺失值做刪除處理。
  2. 針對數據為空值的情況,如果該特征數據缺失情況低於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() # 指定列的缺失值刪除


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM