ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pandas] 데이터프레임 결측치 확인, 결측치 처리 삭제 대체 :: isnull, dropna, fillna, ffill, bfill
    직접 해보기/Python 2024. 6. 30. 21:17
    728x90
    반응형

    Pandas 데이터프레임에서 결측치 확인하고 처리해보기!


    1️⃣  결측치 여부, 결측치 개수 확인하기  ::  isnull()

    • isnull() : 데이터프레임의 값들이 결측치인지 아닌지, 여부를 확인할 수 있습니다. 아래처럼 True/False로 결과가 출력됩니다.
    • isnull().sum() : 칼럼별로 결측치 개수를 출력합니다.
    # 결측치 여부를 확인
    df_na.isnull()
    
    # 칼럼별로 결측치 개수 출력하기
    df_na.isnull().sum()


    2️⃣-1.  결측치 삭제 — 결측치 있는 행(row) 삭제하기  ::  dropna()

    • 결측치가 1개라도 포함된 행이라면, 해당 행을 삭제해버리는 방법입니다. 결측치 비중이 적은 경우에 적합한 방법이에요.
      결측치가 많은데 삭제해버린다면, 데이터 손실이 커지고 분석모델에 원래 데이터의 특성을 반영하기 어려워지겠죠.
    • df.dropna() : 데이터프레임에서 결측치가 포함된 행은 삭제합니다.
    • df.dropna(how='all') : 모든 데이터가 결측치인 행만 삭제합니다.
    # 결측치 있는 행 삭제하기
    df_na_test1 = df_na.dropna()
    
    # 모든 데이터가 결측치인 행만 삭제하기
    df_na_test2 = df_na.dropna(how = 'all')

     

    2️⃣-2.  결측치 삭제 — 결측치 많은 열(column) 삭제하기  ::  drop(axis=1)

    • 한 칼럼에서 결측치가 일정 비중이상으로 많으면, 해당 칼럼은 아예 삭제하는 방법입니다.
      일반적으로 결측치 비중이 50% 초과인 경우 삭제를 고려합니다. 다만 케이스에 따라 기준을 명확하게 잡고 가야겠죠. 
    • df.drop(columns = [삭제할 칼럼이름 리스트], axis=1) : 데이터프레임에서 특정 칼럼(들)을 삭제합니다.


    3️⃣-1.  결측치 대체 — 수치형 칼럼에서 결측치 대체하기  ::  fillna()

    • df.fillna() : 결측치를 특정 값으로 대체할 수 있습니다. 일반적으로 평균값, 중앙값, 최빈값 등으로 채웁니다.
      대체값은 실제값이 아니므로, 너무 많은 결측치들을 같은 값으로 대체하면 편향이 생길 수 있음을 알고 진행해야 합니다.

    • 수치형 데이터 칼럼인 경우, 보통 평균값이나 중앙값으로 대체합니다.
      - 평균값은 이상치에 민감하므로, 이상치가 적거나 없으면 평균값으로 대체하면 됩니다.
      - 이상치가 많다면, 비교적 이상치에 덜 민감한 중앙값으로 대체하는 것이 좋습니다.
    • duration, price 칼럼은 중앙값으로, days_left 칼럼은 평균값으로 대체해보겠습니다.
    # 결측치 대체할 데이터프레임 따로 카피
    df_fillna = df_na.copy()
    
    # 비행시간, 가격은 중앙값으로 대체
    df_fillna['duration'] = df_fillna['duration'].fillna(df_fillna['duration'].median())
    df_fillna['price'] = df_fillna['price'].fillna(df_fillna['price'].median())
    
    # 출발까지 남은일수는 평균값으로 대체
    df_fillna['days_left'] = df_fillna['days_left'].fillna(df_fillna3['days_left'].mean())
    
    # 결측치 처리 확인
    df_fillna.isnull().sum()

     

    3️⃣-2.  결측치 대체 — 범주형 칼럼에서 결측치 대체하기  ::  bfill(), ffill()

    • 범주형 데이터 칼럼인 경우, 일반적으로 최빈값 혹은 근처의 값들로 대체합니다.
      - df.fillna(df.mode().iloc[0]) : 최빈값으로 대체

      - df.ffill : 바로 위 행의 값으로 대체
      - df.bfill : 바로 아래 행의 값으로 대체
    # 범주형 칼럼별 최빈값으로 결측치 대체하기
    df_fillna = df_fillna.fillna(df_fillna.mode().iloc[0])
    
    # 이전 인덱스(윗줄)에 있는 값으로 결측치 대체하기
    df_fillna = df_fillna.ffill()
    
    # 다음 인덱스(아랫줄)에 있는 값으로 결측치 대체하기
    df_fillna = df_fillna.bfill()

     

    728x90
    반응형