VOD 강의 안내
[인프런] Google 공인! 텐서플로(TensorFlow) 딥러닝 개발자 자격증 취득 -
후기 구경가기
이번 에피소드에서는 Pandas 데이터프레임(DataFrame) 의 복사(Copy) 와 중요한 전처리 Task 중의 하나인 결측치 처리 에 대해서 알아보겠습니다.
DataFrame을 활용하여 새로운 Feature(특성)을 만들어 추가하거나, 필요 없는 컬럼을 제거했을 때 원본 DataFrame이 손상되었기 때문에 다시 파일로부터 불러와야하는 불상사가 생기게 됩니다. 그래서 저는 DataFrame의 복사 기능을 잘 활용합니다. (물론 용량이 큰 DataFrame은 복사 할 때마다 용량이 늘어나 RAM이 터질 수 있습니다.)
복사한 후 특성 추출을 해서 추가 EDA를 해보고 아니다 싶으면 버리는 거죠.
그리고, 결측치 처리 주제 또한 이번 에피소드에서 다루는 데요.
결측치 처리는 데이터 전처리 프로세스 중 가장 중요하다고 생각하는 프로세스 중 하나 입니다.
결측치를 어떻게 처리해 주느냐에 따라 나중에 머신러닝 모델에 데이터를 주입하고 예측한 결과가 달라지는 경우도 많습니다.
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
컬럼(columns) 설명
survivied: 생존여부 (1: 생존, 0: 사망)
pclass: 좌석 등급 (1등급, 2등급, 3등급)
sex: 성별
age: 나이
sibsp: 형제 + 배우자 수
parch: 부모 + 자녀 수
fare: 좌석 요금
embarked: 탑승 항구 (S, C, Q)
class: pclass와 동일
who: 성별과 동일
adult_male: 성인 남자 여부
deck: 데크 번호 (알파벳 + 숫자 혼용)
embark_town: 탑승 항구 이름
alive: 생존여부 (yes, no)
alone: 혼자 탑승 여부
DataFrame을 복제 합니다. 복제한 DataFrame을 수정해도 원본에는 영향을 미치지 않습니다.
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
copy()
로 DataFrame을 복제합니다.
id 값을 확인하면 두 DataFrame의 메모리 주소가 다름 을 확인할 수 있습니다.
(140082615351616, 140082615351952)
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
df_copy
의 age
를 99999로 임의 수정하도록 하겠습니다.
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
0
0
3
male
99999.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
하지만, 원본 DataFrame의 데이터는 변경되지 않고 그대로 남아 있습니다.
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
결측치는 비어있는 데이터 를 의미합니다.
결측치에 대한 처리는 매우 중요합니다.
결측치에 대한 처리를 해주려면 다음의 내용 을 반드시 알아야 합니다.
결측 데이터 확인
결측치가 아닌 데이터 확인
결측 데이터 채우기
결측 데이터 제거하기
결측치 확인 - isnull(), isnan()
컬럼(column)별 결측치의 갯수를 확인하기 위해서는 sum()
함수를 붙혀주면 됩니다.
sum()
은 Pandas의 통계 관련 함수이며, 통계 관련 함수는 추후에 더 자세히 알아볼 예정입니다.
survived 0
pclass 0
sex 0
age 177
sibsp 0
parch 0
fare 0
embarked 2
class 0
who 0
adult_male 0
deck 688
embark_town 2
alive 0
alone 0
dtype: int64
isnull() 과 동작이 완전 같습니다. 편한 것으로 써주세요. (심지어 도큐먼트도 같습니다)
survived 0
pclass 0
sex 0
age 177
sibsp 0
parch 0
fare 0
embarked 2
class 0
who 0
adult_male 0
deck 688
embark_town 2
alive 0
alone 0
dtype: int64
DataFrame 전체 결측 데이터의 갯수를 합산하기 위해서는 sum()
을 두 번 사용하면 됩니다.
결측치가 아닌 데이터 확인 - notnull()
notnull()
은 isnull()
과 정확히 반대 개념입니다.
survived 891
pclass 891
sex 891
age 714
sibsp 891
parch 891
fare 891
embarked 889
class 891
who 891
adult_male 891
deck 203
embark_town 889
alive 891
alone 891
dtype: int64
isnull()
함수가 결측 데이터를 찾는 boolean index 입니다.
즉, loc
에 적용하여 조건 필터링을 걸 수 있습니다.
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
5
0
3
male
NaN
0
0
8.4583
Q
Third
man
True
NaN
Queenstown
no
True
17
1
2
male
NaN
0
0
13.0000
S
Second
man
True
NaN
Southampton
yes
True
19
1
3
female
NaN
0
0
7.2250
C
Third
woman
False
NaN
Cherbourg
yes
True
26
0
3
male
NaN
0
0
7.2250
C
Third
man
True
NaN
Cherbourg
no
True
28
1
3
female
NaN
0
0
7.8792
Q
Third
woman
False
NaN
Queenstown
yes
True
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
859
0
3
male
NaN
0
0
7.2292
C
Third
man
True
NaN
Cherbourg
no
True
863
0
3
female
NaN
8
2
69.5500
S
Third
woman
False
NaN
Southampton
no
False
868
0
3
male
NaN
0
0
9.5000
S
Third
man
True
NaN
Southampton
no
True
878
0
3
male
NaN
0
0
7.8958
S
Third
man
True
NaN
Southampton
no
True
888
0
3
female
NaN
1
2
23.4500
S
Third
woman
False
NaN
Southampton
no
False
177 rows × 15 columns
fillna()
를 활용하면 결측치에 대하여 일괄적으로 값을 채울 수 있습니다.
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
886
0
2
male
27.0
0
0
13.00
S
Second
man
True
NaN
Southampton
no
True
887
1
1
female
19.0
0
0
30.00
S
First
woman
False
B
Southampton
yes
True
888
0
3
female
NaN
1
2
23.45
S
Third
woman
False
NaN
Southampton
no
False
889
1
1
male
26.0
0
0
30.00
C
First
man
True
C
Cherbourg
yes
True
890
0
3
male
32.0
0
0
7.75
Q
Third
man
True
NaN
Queenstown
no
True
888번 index의 결측치가 700으로 채워 진 것을 확인할 수 있습니다.
886 27.0
887 19.0
888 700.0
889 26.0
890 32.0
Name: age, dtype: float64
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
886
0
2
male
27.0
0
0
13.00
S
Second
man
True
NaN
Southampton
no
True
887
1
1
female
19.0
0
0
30.00
S
First
woman
False
B
Southampton
yes
True
888
0
3
female
700.0
1
2
23.45
S
Third
woman
False
NaN
Southampton
no
False
889
1
1
male
26.0
0
0
30.00
C
First
man
True
C
Cherbourg
yes
True
890
0
3
male
32.0
0
0
7.75
Q
Third
man
True
NaN
Queenstown
no
True
카테고리 형 데이터 을 채워주기 위해서는 다음과 같은 과정을 거쳐야 합니다.
이미 카테고리가 추가된 'A'나 'B'는 바로 fillna() 할 수 있습니다.
0 A
1 C
2 A
3 C
4 A
..
886 A
887 B
888 A
889 C
890 A
Name: deck, Length: 891, dtype: category
Categories (7, object): [A, B, C, D, E, F, G]
하지만, 없는 카테고리로 채워주고자 할 때는 먼저 add_categories
로 카테고리를 추가한 후 채워야 합니다.
0 No Data
1 C
2 No Data
3 C
4 No Data
...
886 No Data
887 B
888 No Data
889 C
890 No Data
Name: deck, Length: 891, dtype: category
Categories (8, object): [A, B, C, D, E, F, G, No Data]
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
886
0
2
male
27.0
0
0
13.00
S
Second
man
True
NaN
Southampton
no
True
887
1
1
female
19.0
0
0
30.00
S
First
woman
False
B
Southampton
yes
True
888
0
3
female
NaN
1
2
23.45
S
Third
woman
False
NaN
Southampton
no
False
889
1
1
male
26.0
0
0
30.00
C
First
man
True
C
Cherbourg
yes
True
890
0
3
male
32.0
0
0
7.75
Q
Third
man
True
NaN
Queenstown
no
True
886 27.000000
887 19.000000
888 29.699118
889 26.000000
890 32.000000
Name: age, dtype: float64
886 27.0
887 19.0
888 28.0
889 26.0
890 32.0
Name: age, dtype: float64
0 C
Name: deck, dtype: category
Categories (7, object): [A, B, C, D, E, F, G]
최빈값(mode) 으로 채울 때에는 반드시 0번째 index 지정 하여 값을 추출한 후 채워야 합니다.
886 C
887 B
888 C
889 C
890 C
Name: deck, dtype: category
Categories (7, object): [A, B, C, D, E, F, G]
NaN 값이 있는 데이터 제거하기 (dropna)
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
886
0
2
male
27.0
0
0
13.00
S
Second
man
True
NaN
Southampton
no
True
887
1
1
female
19.0
0
0
30.00
S
First
woman
False
B
Southampton
yes
True
888
0
3
female
NaN
1
2
23.45
S
Third
woman
False
NaN
Southampton
no
False
889
1
1
male
26.0
0
0
30.00
C
First
man
True
C
Cherbourg
yes
True
890
0
3
male
32.0
0
0
7.75
Q
Third
man
True
NaN
Queenstown
no
True
dropna()
로 1개 라도 NaN 값이 있는 행 은 제거할 수 있스빈다. (how='any'
)
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
6
0
1
male
54.0
0
0
51.8625
S
First
man
True
E
Southampton
no
True
10
1
3
female
4.0
1
1
16.7000
S
Third
child
False
G
Southampton
yes
False
11
1
1
female
58.0
0
0
26.5500
S
First
woman
False
C
Southampton
yes
True
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
871
1
1
female
47.0
1
1
52.5542
S
First
woman
False
D
Southampton
yes
False
872
0
1
male
33.0
0
0
5.0000
S
First
man
True
B
Southampton
no
True
879
1
1
female
56.0
0
1
83.1583
C
First
woman
False
C
Cherbourg
yes
False
887
1
1
female
19.0
0
0
30.0000
S
First
woman
False
B
Southampton
yes
True
889
1
1
male
26.0
0
0
30.0000
C
First
man
True
C
Cherbourg
yes
True
182 rows × 15 columns
기본 옵션 값은 how=any
로 설정되어 있으며, 다음과 같이 변경할 수 있습니다.
any : 1개 라도 NaN값이 존재시 drop
all : 모두 NaN값이 존재시 drop
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
886
0
2
male
27.0
0
0
13.0000
S
Second
man
True
NaN
Southampton
no
True
887
1
1
female
19.0
0
0
30.0000
S
First
woman
False
B
Southampton
yes
True
888
0
3
female
NaN
1
2
23.4500
S
Third
woman
False
NaN
Southampton
no
False
889
1
1
male
26.0
0
0
30.0000
C
First
man
True
C
Cherbourg
yes
True
890
0
3
male
32.0
0
0
7.7500
Q
Third
man
True
NaN
Queenstown
no
True
891 rows × 15 columns
태그:
dataframe ,
fillna ,
pandas ,
결측치 ,
데이터프레임 ,
복사 ,
파이썬 데이터 분석 ,
판다스 ,
판다스 자료구조 ,
판다스 튜토리얼
카테고리:
pandas
업데이트: January 23, 2021
댓글남기기