datastatistician
데이터로 일기 쓰기
datastatistician
전체 방문자
오늘
어제
  • 분류 전체보기 (19)
    • Python (11)
      • pandas (4)
      • Visualization (0)
      • RPA (0)
      • 알고리즘 (5)
      • Database (2)
    • Java (0)
    • SQL (1)
      • PLSQL (0)
      • DBMS (1)
    • ML&DL (2)
    • Dev (3)
      • Git (1)
      • Linux (0)
      • VScode (1)
      • docker (0)
      • AWS (1)
    • Mac (1)
    • 오류 해결 (1)

블로그 메뉴

  • 태그

공지사항

인기 글

태그

  • Database
  • datetime indexing
  • keras
  • MySQL
  • MSSQL
  • SQL
  • DBeaver
  • Curse of Dimensionality
  • Free Tier
  • tensorflow
  • scikit-learn
  • deep learning
  • pandas
  • parallelize
  • 코딩테스트
  • Upsert
  • Visual Studio Code
  • itertools
  • sql query
  • autoencoder
  • multiprocessing
  • LSTM
  • 내장함수
  • Dimensionality Reduction
  • astype
  • vscode
  • Mac
  • 결측치
  • MySQL DBeaver
  • Python

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
datastatistician

데이터로 일기 쓰기

Python/pandas

Pandas에서 결측치를 채워넣는 여러 방법들

2021. 7. 13. 17:24

데이터 분석가의 재량을 넘어서서 현장의 문제가 존재하기 때문에,

아무리 좋은 데이터를 가져온다 하더라도 결측치는 존재할 수 밖에 없다.

학생 신분으로 실습을 할 때에는 결측치를 대부분 없앤 뒤 데이터를 사용하였지만,

회사에서 일을 하는 입장이 되니 정합성 있게 데이터를 채워넣는 일이 중요해졌다.

따라서 pandas에서 결측치를 단순히 없애는 방법이 아닌, 정교하게 채워넣는 기술들에 대해 정리해보려 한다.

 

1. fillna함수 응용하기

# fillna() 함수로 결측치 채워넣기
df.fillna(0) # 결측치를 0으로 채우기
df.fillna('a') # 결측치를 a라는 문자열로 채우기
df.fillna(method= 'ffill') # 뒤의 결측치를 앞의 값으로 채우기. 'pad'도 사용 가능하다.
df.fillna(method= 'bfill') # 앞의 결측치를 뒤의 값으로 채우기. 'backfill'도 사용 가능하다.
df.fillna(df.mean()) # 결측값을 변수별 평균으로 채우기
df.where(pd.notnull(df), df.mean(), axis='columns') # 결측값을 변수별 평균으로 채우기 2번째 방법

pandas의 fillna() 메서드는 자체적으로 값을 채울 여러 방법들을 제공한다.

대부분의 경우 fillna(0)으로 없는 값은 0으로 채워넣는 경우가 많지만,

값이 존재하는 맨 앞의 값이나 맨 뒤의 값으로 쭉 채워넣는 단순한 로직을 구현할 때 효과적이다.

 

2. interpolate함수 응용하기

# interpolate함수 응용하기
df.interpolate() # Nan값을 앞뒤의 값의 동일 간격으로 채우기
df.interpolate(method='time') # 시계열날짜 index를 기준으로 결측값을 채움
df.interpolate(method='values') # 선형으로 비례하는 값들로 결측치를 채움
df.interpolate(method='values', limit=1) # 연속적으로 보간하는 개수를 1개로 제한함.
df.interpolate(method='values', limit=1, limit_direction='backward') # 연속적으로 보간하는 개수가 1이면서 뒤 방향에서 채움.

소위 '보간법'이라는 한국말로 불리는 interpolate 함수이다.

앞뒤의 값을 고려하여 균형있게 값을 채워넣을 때 효과적이다.

위 코드의 예시에서 보듯, 다향한 속성으로 값을 보간하는 방식을 조율할 수 있다.

시계열데이터의 결측치를 채워넣을 때 특히 효과적이다.

 

3. replace함수 응용하기

# replace 함수 응용하기
df.replace(2,20) # 2라고 명시된 값을 20으로 바꾸기
df.replace(np.nan, 5) # nan값을 5로 바꾸기
df.replace([1,2,3,np.nan],[5,6,7,8]) # 리스트에 해당하는 값들 각각을 바꾸기
df.replace({1:5, 2:6, 3:7, np.nan: 10}) # 딕셔너리에 대응되는 값들을 각각 바꾸기. df.replace({old1: new1, old2: new2})

replace함수는 값을 대응하여 바꿀 때 사용되는 메서드이다.

이 때 바꿀 값을 Nan으로 지정한다면 이는 결측치를 채우는 방식으로도 쓸 수 있다는 이야기이다.

dictionary형태로 내가 원하는 값을 다른 값으로 대응하여 바꿀 수 있어 굉장히 유용하다.

필자의 경우 공장의 데이터를 다루면서 발생하는 다양한 Error Case를 직접 태깅하여 채울 때 주로 사용하곤 한다.

 

4. numpy의 where함수 응용하기

# np.where함수로 채워넣기
df["column"] = np.where(condition, 1, 0)

numpy의 where함수는 조건에 맞는 경우를 boolean으로 인지하여,

참일 경우와 거짓일 경우의 값을 반환한다.

위의 replace함수가 값을 대응하여 결측치를 채워넣는 데 효과적인 방법이라면,

해당 방식은 조건부로 값을 채워넣을 때 유용하다.

저작자표시 비영리 변경금지 (새창열림)

'Python > pandas' 카테고리의 다른 글

같은 column에서 numeric 자료만 골라내기  (0) 2021.12.15
Pandas에서 DateTime Indexing 응용하기  (0) 2021.08.12
Pandas concat 함수 응용하기  (0) 2021.07.05
    'Python/pandas' 카테고리의 다른 글
    • 같은 column에서 numeric 자료만 골라내기
    • Pandas에서 DateTime Indexing 응용하기
    • Pandas concat 함수 응용하기
    datastatistician
    datastatistician
    https://github.com/shawnbae

    티스토리툴바