본문 바로가기

Programming/Python

[pandas] 결손데이터 처리함수 사용하기

반응형

 

 

 

 

pandas 데이터 결손처리 방법

 

이번 포스팅에서는 판다스를 활용한 데이터 결손처리에 대해 알아보도록 하겠습니다.

판다스에서 제공하는 isna() , fillna() 함수를 활용하면 간단하게 데이터 결손 처리가 가능합니다.

 

판다스를 임포트한 후 기존 포스팅에서 활용했던 타이타닉 데이를 이용해 데이터를 출력해 보겠습니다.

In [12]:
import pandas as pd
titanic_df = pd.read_csv('titanic_train.csv')
titanic_df.head(10)
Out[12]:
  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
5 6 0 3 Moran, Mr. James male NaN 0 0 330877 8.4583 NaN Q
6 7 0 1 McCarthy, Mr. Timothy J male 54.0 0 0 17463 51.8625 E46 S
7 8 0 3 Palsson, Master. Gosta Leonard male 2.0 3 1 349909 21.0750 NaN S
8 9 1 3 Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) female 27.0 0 2 347742 11.1333 NaN S
9 10 1 2 Nasser, Mrs. Nicholas (Adele Achem) female 14.0 1 0 237736 30.0708 NaN C
 

Cabin 열을 보면 NaN 으로 표시되는 항목이 보입니다. 해당 데이터가 결손데이터 입니다.

 
 
 

info( ) 함수를 사용하여 데이터 확인

info() 함수를 사용하면 데이터 로우와 칼럼 , 칼럼별 데이터 타입, Non-null 개수, 데이터 타입 요약을 간단하게 확인할 수있습니다.

In [5]:
titanic_df.info()
 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Cabin        204 non-null    object 
 11  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
 

891 개의 데이터 중 age, cabin 항목에 결손 데이터가 있음을 한눈에 확인 가능합니다.

 
 
 

isna() 함수를 활용한 데이터 확인

isna() 함수를 사용하면 NaN 값을 True /False 형식으로 반환합니다. sum() 함수를 추가하면 결손 데이터 갯수를 확인 가능합니다.

In [6]:
# isna() 를 이용해 NaN 을 확인
# True / False 값으로 결과를 반황함 (NaN 일 경우 True)

titanic_df.isna().head(3)
Out[6]:
  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 False False False False False False False False False False True False
1 False False False False False False False False False False False False
2 False False False False False False False False False False True False
In [7]:
# SUM 함수를 추가해 결손 데이터 갯수 확인 가능

titanic_df.isna( ).sum( )
Out[7]:
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64
 

age 177, cabin 687, Embarked 2 개의 결손 데이터가 있음을 확인 할 수 있습니다.

 

fillna() 함수로 결손데이터 대체

 

fillna() 함수를 활용하면 결손데이터를 다른 데이터로 대체할 수 있습니다. Cabin 열의 결손 데이터를 'C00' 으로 대체해 보겠습니다.

In [13]:
# fillna() 함수로 결손데이터 대체 가능 

titanic_df['Cabin'] = titanic_df['Cabin'].fillna('C000')
titanic_df.head(3)
Out[13]:
  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 C000 S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 C000 S
 
 
 

age 는 mean() 함수를 사용하여 다른 데이터의 평균값으로 지정하고 , Embarked 는 'S' 로 대체해 보겠습니다.

In [15]:
titanic_df['Age'] = titanic_df['Age'].fillna(titanic_df['Age'].mean())
titanic_df['Embarked'] = titanic_df['Embarked'].fillna('S')
titanic_df.isna().sum()
Out[15]:
PassengerId    0
Survived       0
Pclass         0
Name           0
Sex            0
Age            0
SibSp          0
Parch          0
Ticket         0
Fare           0
Cabin          0
Embarked       0
dtype: int64
 

isna() 함수로 다시 데이터를 확인해 보면 NaN 데이터가 모두 대체된 것을 확인 할 수 있습니다. 이제 실제 데이터를 한번 확인해 보겠습니다.

In [16]:
titanic_df.head(10)
Out[16]:
  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.000000 1 0 A/5 21171 7.2500 C000 S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.000000 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.000000 0 0 STON/O2. 3101282 7.9250 C000 S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.000000 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.000000 0 0 373450 8.0500 C000 S
5 6 0 3 Moran, Mr. James male 29.699118 0 0 330877 8.4583 C000 Q
6 7 0 1 McCarthy, Mr. Timothy J male 54.000000 0 0 17463 51.8625 E46 S
7 8 0 3 Palsson, Master. Gosta Leonard male 2.000000 3 1 349909 21.0750 C000 S
8 9 1 3 Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) female 27.000000 0 2 347742 11.1333 C000 S
9 10 1 2 Nasser, Mrs. Nicholas (Adele Achem) female 14.000000 1 0 237736 30.0708 C000 C
 

기존 데이터와 비교해 보면 age 항목이 모두 정상적으로 대체된 것을 확인할 수 있습니다.