취뽀 기록

#열심히 살자 #취업 #공부

Python

[python] 데이터 전처리 - 널값 처리

hyunnn_00 2023. 6. 1. 17:39

6. 데이터 전처리

✔️ 널값

# = 비어 있는 데이터(값) = 누락 데이터
df = sns.load_dataset('titanic')
df.info()

# Non-Null Count
# 전체 행 개수가 891개 이므로 Non-Null Count도 891개 되어야 널값이 없는 것
# 891개보다 적으면 널값이 있으니 확인할 것

# 빈도표 = 해당 열 고유값 & NaN 미포함
df['deck'].value_counts()

# 빈도표 = 해당 열 고유값 & NaN 포함
df['deck'].value_counts(dropna = False)

# 널값을 직접 확인
# isnull()의 결과가 True = 널값, False = 널값이 아님
df.head().isnull()

# isnull()의 결과가 True = 널값이 아님, False = 널값
df.head().notnull()

✔️ 널값 개수

# 널값 개수 합 = 열 단위로 계산하는 것이 기본
df.isnull().sum()

✔️ 널값 제거

# 특정 개수 이상의 널값이 있는 열 삭제
df = df.dropna(axis = 1, thresh = 300)

## 300개 이상의 널값이 있는 열 삭제됨

# 널값이 있는 행 삭제
# any = 널 값이 하나라도 있으면 삭제
df.dropna(subset = 'age', how = 'any') # age 열에서 널 값이 하나라도 있으면 삭제
# = df.dropna(subset = 'age', how = 'any', axis = 0)

✔️ 널값 대체 : fillna

  • 평균
# 평균으로 대체
age_mean = df['age'].mean()

df['age'] = df['age'] .fillna(age_mean)
# df['age'] .fillna(age_mean, inplace = True)
  • 최빈값
# 널값을 직접 찾아서 확인
df[df['embark_town'].isnull() == True]

# 최빈값 가져오기
town_mode = df['embark_town'].value_counts().idxmax()

# 최빈값으로 대체
df['embark_town'].fillna(town_mode, inplace = True)
  • 주변값
# 앞에 있는 값으로 대체
df['embarked'].fillna(method = 'ffill')[826:831]

# 뒤에 있는 값으로 대체
df['embarked'].fillna(method = 'bfill')[826:831]

✔️ 중복 데이터 : duplicated

# 중복 데이터 확인
print(df)
print(df.duplicated()) # True가 중복이라는 의미

# 중복 데이터 제거
print(df)
print(df.drop_duplicates())

✔️ 데이터 표준화

# 연비 mpg = mile per gallon
# kpl =kilometer per liter
# 1 mpg = 0.425 kpl
kpl = 0.425
df['kpl'] = df['mpg'] * kpl
df['kpl'] = df['kpl'].round(1)