데이터 전처리 - 결측치 탐지와 다양한 처리 방법
결측치(Missing Value) 탐지
Pandas는 결측치를 쉽게 탐지하고 처리할 수 있는 다양한 기능 제공
isna(), isnull()로 결측치 탐지
데이터프레임의 각 요소가 결측치인지 여부를 확인, 두 함수는 동일한 기능을 함
=> 최신 코드에서는 isna()사용권장, 호환성을 유지해야하거나 기존 코드에서 사용중이라면 isnull()사용
import pandas as pd
#예시 데이터프레임 생성
data = {
'이름' : ['철수','영희','민수','지수'],
'나이' : [25,30,None,35],
'직업' : ['학생','회사원','학생',None]
}
df = pd.DataFrame(data)
#결측치 여부 확인
df.isna()
df.info()와 비교
난 사실.. 데이터 분석, 전처리할 때 걍 df.info()찍고 데이터타입이랑 결측치 어느 컬럼에 결측치 있는지만 본다.. 세세하게 어느 위치에 결측치가 있는지 알 필요가 있는 경우가 잘 없었다, ;ㅅ;.. 오히려 큰 데이터에서 대충 결측치가 있는 것 같다 싶으면 isna().sum()은 많이 씀... 또 이상치도 모두 결측으로 바꾼경우나.. 그럴 때 결측 정도 보려고 isna().sum()썼다. isna()는.... 단독으로 언제 사용하는게 좋을까...? 결측값 패턴 시각화 정도..?
그 이유
상대방의 상황적 한계나 고정된 관점을 더 잘 이해하고 대화를 시작했어야 했다는 점에서 내 전달 방식에 부족함이 있었다고 생각함. 특히 전제에 대한 공감대를 형성하는 데 더 신경을 쓰거나, 상대방이 놓칠 수 있는 부분을 강조하는 방식으로 대화를 이끌어야한다는 생각을 함. 앞으로는 내 생각을 전달할 때 상대방의 이해를 돕기 위해 전제를 더 구체적으로 설명하거나, 논의를 좀 더 차근차근 이끌어 나가는 노력이 필요할 듯. 아니면 괜히 말꺼냈다가 서로 생각한다고, 말한다고 진빠지는데 걍 말을 꺼내지 말자. 혼자 고민해보자.
isna() 또는 isnull(), sum() 조합하여 결측치의 총 개수 확인
#각 열별 결측치 개수 확인
df.isna().sum()
결측치의 처리 방법은 데이터의 특성과 분석 목적에 따라 달라진다.
#결측치가 있는 행 제거
df_dropped_rows = df.dropna()
df_dropped_rows
#결측치가 있는 열을 제거하려면 axis = 1을 지정
#결측치가 있는 열 제거
df_dropped_columns = df.dropna(axis = 1)
df_dropped_columns
결측치 대체(채우기) - fillna()함수 사용
#결측치를 '없음'으로 대체
df_filled = df.fillna('없음')
df_filled
평균, 중앙값, 최빈값 등으로 결측치 채우기
#'나이'열의 결측치를 평균값으로 대체
df['나이'] = df['나이'].fillna(df['나이'].mean())
df
결측치 보간(Interpolation)
주변 값들을 기반으로 보간. 특히 시간 데이터를 다룰 때 유용
#예시 데이터프레임 생성
data = {
'날짜' = pd.date_range('2023-01-01', periods = 5),
'온도' = [20,22,None,24,25]
}
df2 = pd.DataFrame(data)
#선형 보간법으로 결측치 채우기
df2['온도'] = df2['온도'].interpolate()
df2
고급 결측치 처리 방법
특정 조건을 기반으로 결측치 처리
예) 다른 열의 값을 기준으로 결측치를 채우는 방법
#'직업'이 '학생'인 경우 '나이'를 20으로 채우기
df.loc[(df['직업'] == '학생') & (df['나이'].isna()), '나이'] = 20
df
apply()사용, 사용자 정의 함수 적용
#예시 : '나이'가 결측치일 경우, 기본값으로 18을 채우는 함수
def fill_missing_age(x):
if pd.isna(x):
return 18
df['나이'] = df['나이'].apply(fill_missing_age)
df
'Python to AI' 카테고리의 다른 글
Python - Pandas(데이터 전처리 : 이상치 탐지 및 처리) (10) | 2024.12.10 |
---|---|
Python - Matplotlib 한글폰트 커스텀컨피그 (6) | 2024.12.10 |
Python - Pandas(데이터 변형 : 그룹화, 집계, 피벗테이블) (4) | 2024.12.09 |
Python - Pandas(데이터 변형 : 정렬, 병합) (1) | 2024.12.09 |
Python - Pandas(feat.isin(), astype()) (0) | 2024.12.08 |