본문 바로가기

Python 파이썬

파이썬 데이터프레임 - pandas 기초(4-2)

4. 데이터프레임 변경

 

4.2.1 결측치 처리

  • 결측치(NaN)은 정확한 분석을 방해, 오류가 발생할 수 있음
# 라이브러리 불러오기
import pandas as pd
import numpy as np
import seaborn as sns

# 타이타닉 데이터 불러오기
titanic = sns.load_dataset(('titanic'))

# survived, pclass, sex, age, embarked 컬럼만 조회할 수 있는 데이터 프레임 생성
df = titanic[['survived','pclass','sex','age','embarked']]
df

 

- 결측치 찾기

 

  • info()
# info()
df.info()

=> info() 함수를 통해 데이터 정보 확인. 

=> 결측치는 Non-Null Count로 확인할 수 있음 : 결측치가 아닌 데이터 행 수

=> 전체 행 개수는 891 entries로 891개

=> age 컬럼 : 714 non-null, embarked 컬럼 : 889 non-null로 결측치 행이 존재한다는 것을 알 수 있음

 

  • isna() / notnull()
    • isna() : 결측치면 True, 값이 있으면 False 반환 ( isnull() 사용가능 )
    • notnull() : 결측치면 False, 값이 있으면 True 반환
# 결측치 확인
df.isna()

=>  값이 결측치면 True, 값이 있으면 False

 

** 결측치 개수 확인

# 결측치 개수 확인
df.isna().sum()

=> 각 컬럼의 결측치 개수 확인

 

- 결측치 제거

  • 결측치 행 제거
# df를 복사하여 df1 데이터프레임 생성
df1 = df.copy()

# 결측치가 하나라도 있는 행 제거
df1.dropna(axis=0, inplace=True)
df1.isna().sum()

=> 결측치가 있는 행을 모두 제거한 후, 결측치가 없는 것을 확인할 수 있다.

 

  • 특정 컬럼, 결측치 행 제거
# 데이터프레임 복사
df2 = df.copy()

# age 열이 결측치인 행 제거
df2.dropna(subset='age', axis=0, inplace=True)
df2.isna().sum()

 

=> age 컬럼의 결측치를 모두 제거함

 

  • 결측치 있는 컬럼 제거
# 데이터프레임 복사
df3 = df.copy()

# 결측치가 있는 열 제거
df3.dropna(axis=1, inplace=True)
df3.isna().sum()

=> 결측치가 있는 age, embarked 컬럼 제거

 

 

- 결측치 채우기

  • fillna() : 결측값을 특정값으로 대체
# 데이터프레임 복사
df4 = df.copy()

# age 평균 구하기
mean_age = df4['age'].mean()

# 결측치를 평균값으로 채우기
df4['age'].fillna(mean_age, inplace=True)
df4.isna().sum()

=> age 평균을 구하여, 결측치를 age평균으로 대체함

=> fillna(대체할 값, inplace = True) : 옵션으로 대체할 값을 넣음면 결측치를 대체할 수 있음

 

  • 직전 행, 바로 다음 행으로 대체
# 데이터프레임 복사
df5 = df.copy()

# age 컬럼의 누락된 값을 바로 앞의 값으로 채우기
df5['age'].fillna(method='ffill', inplace=True)

# embarked 컬럼의 누락된 값을 바로 뒤의 값으로 채우기
df5['embarked'].fillna(method='bfill', inplace=True)

df5.isna().sum()

=> method='ffill' : 결측치 바로 앞의 값으로 결측치 대체

=> method='bfill' : 결측치 바로 뒤의 값으로 결측치 대체

 

  • interpolate() : 선형보간법으로 대체
# 데이터프레임 복사
df6 = df.copy()

# 선형보간법으로 채우기
df6['age'].interpolate(method='linear', inplace=True)
df6.isna().sum()

=> 선형보간법을 이용하여 결측치 대체

** 선형보간법 : 1차원 직선상에서 두 점의 값이 주어졌을 때,

                         그 사이의 값을 추정하기 위해 직선 거리에 따라 선형적으로 계산(비례식)하는 방법

 

 

4.2.1 가변수(Dummy Variable) 만들기

  • One-Hot-Encoding이라고도 부름
  • get_dummies() 함수 사용

=> 위 사진처럼 범주형 변수의 값에 따라 해당하는 값을 갖고 있으면 1, 없으면 0으로 나타낸다. (숫자로 변환)

 

1) 범주형 변수 확인

# 데이터 정보 확인
df.info()

=> Dtype에서 object인 컬럼이 주로 범주형 변수임

 

print(df['sex'].value_counts())
print('='*20)
print(df['embarked'].value_counts())

=> sex 컬럼은 male : 577개, female : 314개 // embarked 컬럼은 S : 644개, C : 168개, Q : 77개를 갖는 범주형 변수

 

2) 가변수화

# 가변수화 진행할 변수: sex, embarked
cols = ['sex', 'embarked']
df = pd.get_dummies(df, columns=cols, drop_first=True)
df.head()

=> 가변수화할 변수를 리스트로 저장하여 일괄 처리함

=> sex_male이 1이면 남자, 0이면 여자

=> embarked_Q, embarked_S 둘다 0이면 C 

=> embarked_Q만 1이면 Q

=> embarked_S만 1이면 S

=> drop_first=True 옵션으로 범주형 변수 하나 제거하여 생성

** sex_male의 1은 sex_female의 0과 같기 때문에 하나를 제거하여 컬럼을 줄여주는 것이 좋음