데이터 분석가의 재량을 넘어서서 현장의 문제가 존재하기 때문에,
아무리 좋은 데이터를 가져온다 하더라도 결측치는 존재할 수 밖에 없다.
학생 신분으로 실습을 할 때에는 결측치를 대부분 없앤 뒤 데이터를 사용하였지만,
회사에서 일을 하는 입장이 되니 정합성 있게 데이터를 채워넣는 일이 중요해졌다.
따라서 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 |