<목차>
1. 결측값과 문자열 데이터 이해하기
2. 결측값 확인 및 삭제 방법
3. 결측값 채우기와 데이터 전처리
오늘은 결측값을 처리하는 코드 위주로 소개해 볼 예정이다.
1. 결측값과 문자열 데이터 이해하기
결측값은 0, ' '과는 다른 개념으로 데이터 자체가 없다는 것이다. (같다는 개념도 없음!)
처음부터 값이 없는 데이터를 불러오거나 데이터를 처리하는 과정에서 값이 빠질 때 결측값이 생길 수 있다.
특히 문자열 데이터에서는 단순한 빈칸뿐 아니라 "unknown", "none", "N/A" 같은 문자열도 실제 결측값처럼 사용되는 경우가 많다.
● 특정 문자열을 결측값으로 처리하기
df = pd.read_csv(
"data.csv",
na_values=["unknown", "none", "N/A"]
)
print(df)
2. 결측값 확인 및 삭제 방법
결측값을 처리하기 전에 먼저 데이터 안에 결측값이 얼마나 존재하는지 확인해야 하는데,
isna()와 sum() 함수를 이용해 쉽게 확인할 수 있다.
● 결측값 여부 확인
print(df.isna())
● count() 함수로 데이터 개수 확인하기
결측값을 제외한 실제 데이터의 개수 확인할 떄 사용한다.
print(df.count())
● 컬럼별 결측값 개수 확인
print(df.isna().sum())
● 전체 결측값 개수 확인
print(df.isna().sum().sum())
● 결측값이 있는 행 삭제
결측값이 포함된 행을 삭제할 때는 dropna()를 사용.
df2 = df.dropna()
● 특정 컬럼 기준으로 삭제
df3 = df.dropna(subset=["Age"])
● 결측값이 너무 많은 행만 삭제
df4 = df.dropna(thresh=2)
3. 결측값 채우기 & 데이터 전처리
● 숫자형 데이터 평균값으로 채우기
df["Age"] = df["Age"].fillna(df["Age"].mean())
● 문자열 데이터 특정 값으로 채우기
df["Name"] = df["Name"].fillna("Unknown")
● 최빈값으로 채우기
mode_value = df["City"].mode()[0]
df["City"] = df["City"].fillna(mode_value)
● 앞의 값으로 채우기
df = df.fillna(method="ffill")
● 뒤의 값으로 채우기
df = df.fillna(method="bfill")
● 여러 컬럼 한 번에 결측값 처리하기
각각 다른 방식으로 결측값을 채우고 싶을 때는 fillna()에 딕셔너리 형태로 값을 지정 가능
import pandas as pd
import numpy as np
df = pd.DataFrame({
"Name": ["Tom", np.nan, "Jane"],
"Age": [20, np.nan, 22],
"City": ["Seoul", np.nan, "Busan"]
})
df.fillna({
"Name": "Unknown",
"Age": df["Age"].mean(),
"City": "Seoul"
}, inplace=True)
이런식으로!!
결측값 처리는 데이터 분석의 정확도를 높이는 중요한 과정이니까 잘 기억하고 있어야겠다!!!