본문 바로가기
PYTHON

20200319 - 파이썬 (사이킷런, 판다스, 넘파이, 행렬, 희소행렬, 정규화, 표준화, 범주화)

by 낫싱 2020. 3. 19.
728x90
반응형

 

 

 

hw_pandas02_0318호지수(선생님 문제풀이).pdf
0.33MB
hw_pandas03_0319호지수 - Jupyter Notebook.pdf
0.31MB
ml_pandas_03_0319호지수 - Jupyter Notebook.pdf
0.49MB
hw_pandas03_0319호지수.ipynb
0.02MB
ml_pandas_03_0319호지수.ipynb
0.07MB

 

 

데이터 전처리

누락 데이터 처리

중복 데이터 처리

데이터 표준화

범주형 데이터 처리

정규화

시계열 데이터

누락 데이터 처리

In [1]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

import seaborn as sns # seaborn 은 그래프화 해주는 라이브러리. 얘가 dataset을 제공을 해준다.

 

#titanic 데이터셋 가져오기

titanic_df = sns.load_dataset('titanic')

display(titanic_df.head(3))

print(titanic_df.shape) # 891행, 15열

display(titanic_df.isnull().sum()) # null이 각각 몇개인지

display(titanic_df.info())

print(type(titanic_df))

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 4열 선택4열 다음에 열 추가
  • 5열 선택5열 다음에 열 추가
  • 6열 선택6열 다음에 열 추가
  • 7열 선택7열 다음에 열 추가
  • 8열 선택8열 다음에 열 추가
  • 9열 선택9열 다음에 열 추가
  • 10열 선택10열 다음에 열 추가
  • 11열 선택11열 다음에 열 추가
  • 12열 선택12열 다음에 열 추가
  • 13열 선택13열 다음에 열 추가
  • 14열 선택14열 다음에 열 추가
  • 15열 선택15열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가

열 너비 조절

행 높이 조절

 

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

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

(891, 15)

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

<class 'pandas.core.frame.DataFrame'> RangeIndex: 891 entries, 0 to 890 Data columns (total 15 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 survived 891 non-null int64 1 pclass 891 non-null int64 2 sex 891 non-null object 3 age 714 non-null float64 4 sibsp 891 non-null int64 5 parch 891 non-null int64 6 fare 891 non-null float64 7 embarked 889 non-null object 8 class 891 non-null category 9 who 891 non-null object 10 adult_male 891 non-null bool 11 deck 203 non-null category 12 embark_town 889 non-null object 13 alive 891 non-null object 14 alone 891 non-null bool dtypes: bool(2), category(2), float64(2), int64(4), object(5) memory usage: 80.6+ KB

None

<class 'pandas.core.frame.DataFrame'>

In [2]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# value_counts

titanic_df.survived.value_counts() #0 : 사망, 1 : 생존

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Out[2]:

0 549 1 342 Name: survived, dtype: int64

Q. deck열의 NaN 갯수를 계산하세요.

In [3]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# deck 열의 NaN 개수 계산하기

nan_deck = titanic_df['deck'].value_counts(dropna=False) #NaN 값도 볼거기 때문에 dropna = False 한다.

# nan_deck = df['deck'].value_counts()

display(nan_deck)

display(titanic_df['deck'].isnull().head())

display(titanic_df['deck'].isnull().sum(axis=0)) # axis=0 행방향

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

NaN 688 C 59 B 47 D 33 E 32 A 15 F 13 G 4 Name: deck, dtype: int64

0 True 1 False 2 True 3 False 4 True Name: deck, dtype: bool

688

Q. titanic_df의 처음 5개 행에서 null값을 찾아 출력하세요. (True, False 로)

In [4]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# isnull() 메서드로 누락 데이터 찾기

display(titanic_df.head().isnull().head(2))

display(titanic_df.head().notnull().head(2))

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 4열 선택4열 다음에 열 추가
  • 5열 선택5열 다음에 열 추가
  • 6열 선택6열 다음에 열 추가
  • 7열 선택7열 다음에 열 추가
  • 8열 선택8열 다음에 열 추가
  • 9열 선택9열 다음에 열 추가
  • 10열 선택10열 다음에 열 추가
  • 11열 선택11열 다음에 열 추가
  • 12열 선택12열 다음에 열 추가
  • 13열 선택13열 다음에 열 추가
  • 14열 선택14열 다음에 열 추가
  • 15열 선택15열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가

열 너비 조절

행 높이 조절

 

survived

pclass

sex

age

sibsp

parch

fare

embarked

class

who

adult_male

deck

embark_town

alive

alone

0

False

False

False

False

False

False

False

False

False

False

False

True

False

False

False

1

False

False

False

False

False

False

False

False

False

False

False

False

False

False

False

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 4열 선택4열 다음에 열 추가
  • 5열 선택5열 다음에 열 추가
  • 6열 선택6열 다음에 열 추가
  • 7열 선택7열 다음에 열 추가
  • 8열 선택8열 다음에 열 추가
  • 9열 선택9열 다음에 열 추가
  • 10열 선택10열 다음에 열 추가
  • 11열 선택11열 다음에 열 추가
  • 12열 선택12열 다음에 열 추가
  • 13열 선택13열 다음에 열 추가
  • 14열 선택14열 다음에 열 추가
  • 15열 선택15열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가

열 너비 조절

행 높이 조절

 

survived

pclass

sex

age

sibsp

parch

fare

embarked

class

who

adult_male

deck

embark_town

alive

alone

0

True

True

True

True

True

True

True

True

True

True

True

False

True

True

True

1

True

True

True

True

True

True

True

True

True

True

True

True

True

True

True

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Q. titanic_df의 'deck' 칼럼의 null 의 갯수를 구하세요.

In [36]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# isnull() 메서드로 누락 데이터 개수 구하기

display(titanic_df['deck'].isnull().sum(axis=0))

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

688

In [6]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# 각 칼럼별 null 개수

print(titanic_df.isnull().sum())

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

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

In [7]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# columns 확인

print(titanic_df.columns)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Index(['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'fare', 'embarked', 'class', 'who', 'adult_male', 'deck', 'embark_town', 'alive', 'alone'], dtype='object')

In [8]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# thresh = 500 : NaN 값이 500개 이상인 열을 모두 삭제 - deck 열(891개 중 688개의 NaN 값)

# how = 'any' : NaN값이 하나라도 있으면 삭제

# how = 'all' : 모든 데이터가 NaN 값일 경우에만 삭제

df_thresh = titanic_df.dropna(axis=1, thresh=500)

print(df_thresh.columns)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Index(['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'fare', 'embarked', 'class', 'who', 'adult_male', 'embark_town', 'alive', 'alone'], dtype='object')

Q. embark_town 열의 NaN 값을 바로 앞에 있는 828행의 값으로 변경한 후 출력하세요.

In [9]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# embark_town 열의 NaN값을 바로 앞에 있는 828행의 값으로 변경하기

import seaborn as sns

titanic_df = sns.load_dataset('titanic')

titanic_df.embark_town.isnull().sum()

#print(titanic_df['embark_town'][827:831])

print(titanic_df.embark_town.iloc[827:831],'\n')

titanic_df['embark_town'].fillna(method='ffill', inplace=True) # method = front fill(앞에꺼로 대체), 뒤에꺼로 대체 back fill(bfill)

print(titanic_df['embark_town'][827:831])

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

827 Cherbourg 828 Queenstown 829 NaN 830 Cherbourg Name: embark_town, dtype: object 827 Cherbourg 828 Queenstown 829 Queenstown 830 Cherbourg Name: embark_town, dtype: object

중복 데이터 처리

In [10]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# 중복 데이터를 갖는 데이터프레임 만들기

import pandas as pd

df = pd.DataFrame({'c1':['a','a','b','a','b'],

'c2':[1,1,1,2,2,],

'c3':[1,1,2,2,2]})

print(df)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

c1 c2 c3 0 a 1 1 1 a 1 1 2 b 1 2 3 a 2 2 4 b 2 2

In [11]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

#데이터 프레임 전체 행 데이터 중에서 중복값 찾기

df_dup = df.duplicated()

print(df_dup)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

0 False 1 True 2 False 3 False 4 False dtype: bool

In [12]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# 데이터프레임의 특정 열 데이터에서 중복값 찾기

col_dup_sum = df['c2'].duplicated().sum()

col_dup = df['c2'].duplicated()

print(col_dup_sum,'\n') # c2에서 중복되는 값이 몇개인지 확인

print(col_dup)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

3 0 False 1 True 2 True 3 False 4 True Name: c2, dtype: bool

Q. df에서 중복 행을 제거한 후 df2에 저장하고 출력하세요.

In [37]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# 데이터프레임에서 중복 행을 제거 : drop_duplicates()

display(df)

print()

df2 = df.drop_duplicates()

display(df2)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가
  • 4행 선택4행 다음에 행 추가
  • 5행 선택5행 다음에 행 추가

열 너비 조절

행 높이 조절

 

c1

c2

c3

0

a

1

1

1

a

1

1

2

b

1

2

3

a

2

2

4

b

2

2

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가
  • 4행 선택4행 다음에 행 추가

열 너비 조절

행 높이 조절

 

c1

c2

c3

0

a

1

1

2

b

1

2

3

a

2

2

4

b

2

2

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Q. df에서 c2, c3열을 기준으로 중복 행을 제거한 후 df3에 저장하고 출력하세요

In [14]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

df3=df.drop_duplicates(subset=['c2','c3'])

display(df3) # [1, 1]이 하나의 묶음

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가

열 너비 조절

행 높이 조절

 

c1

c2

c3

0

a

1

1

2

b

1

2

3

a

2

2

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

데이터 단위 변경

In [15]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# read_csv() 함수로 df 생성

import pandas as pd

auto_df = pd.read_csv('auto-mpg.csv') # mile per gallon

auto_df.head()

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Out[15]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 4열 선택4열 다음에 열 추가
  • 5열 선택5열 다음에 열 추가
  • 6열 선택6열 다음에 열 추가
  • 7열 선택7열 다음에 열 추가
  • 8열 선택8열 다음에 열 추가
  • 9열 선택9열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가
  • 4행 선택4행 다음에 행 추가
  • 5행 선택5행 다음에 행 추가

열 너비 조절

행 높이 조절

 

18.0

8

307.0

130.0

3504.

12.0

70

1

chevrolet chevelle malibu

0

15.0

8

350.0

165.0

3693.0

11.5

70

1

buick skylark 320

1

18.0

8

318.0

150.0

3436.0

11.0

70

1

plymouth satellite

2

16.0

8

304.0

150.0

3433.0

12.0

70

1

amc rebel sst

3

17.0

8

302.0

140.0

3449.0

10.5

70

1

ford torino

4

15.0

8

429.0

198.0

4341.0

10.0

70

1

ford galaxie 500

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

In [16]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# mpg(mile per gallon)를 kpl(kilometer per liter) 로 변환(mpg_to_kpl = 0.425)

mpg_to_kpl = 1.60934 / 3.78541

print(mpg_to_kpl) #변환하는 방법

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

0.42514285110463595

Q.'mpg'를 'kpl'로 환산하여 새로운 열을 생성하고 처음 3개 행을 소수점 아래 둘째자리에서 반올림하여 출력하세요.

In [17]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

import pandas as pd

 

# read_csv() 함수로 df 생성

auto_df = pd.read_csv('auto-mpg.csv', header=None)

 

# 열 이름을 지정

auto_df.columns = ['mpg','cylinders','displacement','horsepower','weight','acceleration','model year','origin','name']

 

display(auto_df.head(3))

 

auto_df['kpl'] = round((auto_df['mpg'] * mpg_to_kpl),2)

display(auto_df.head(3))

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 4열 선택4열 다음에 열 추가
  • 5열 선택5열 다음에 열 추가
  • 6열 선택6열 다음에 열 추가
  • 7열 선택7열 다음에 열 추가
  • 8열 선택8열 다음에 열 추가
  • 9열 선택9열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가

열 너비 조절

행 높이 조절

 

mpg

cylinders

displacement

horsepower

weight

acceleration

model year

origin

name

0

18.0

8

307.0

130.0

3504.0

12.0

70

1

chevrolet chevelle malibu

1

15.0

8

350.0

165.0

3693.0

11.5

70

1

buick skylark 320

2

18.0

8

318.0

150.0

3436.0

11.0

70

1

plymouth satellite

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 4열 선택4열 다음에 열 추가
  • 5열 선택5열 다음에 열 추가
  • 6열 선택6열 다음에 열 추가
  • 7열 선택7열 다음에 열 추가
  • 8열 선택8열 다음에 열 추가
  • 9열 선택9열 다음에 열 추가
  • 10열 선택10열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가

열 너비 조절

행 높이 조절

 

mpg

cylinders

displacement

horsepower

weight

acceleration

model year

origin

name

kpl

0

18.0

8

307.0

130.0

3504.0

12.0

70

1

chevrolet chevelle malibu

7.65

1

15.0

8

350.0

165.0

3693.0

11.5

70

1

buick skylark 320

6.38

2

18.0

8

318.0

150.0

3436.0

11.0

70

1

plymouth satellite

7.65

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

In [18]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# 각 열의 자료형 확인

print(auto_df.dtypes)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

mpg float64 cylinders int64 displacement float64 horsepower object weight float64 acceleration float64 model year int64 origin int64 name object kpl float64 dtype: object

Q. horsepower 열의 고유값을 출력하세요.

In [19]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

print(auto_df['horsepower'].unique())

# '?' 때문에 문자(string=object)로 바뀐 것임

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

['130.0' '165.0' '150.0' '140.0' '198.0' '220.0' '215.0' '225.0' '190.0' '170.0' '160.0' '95.00' '97.00' '85.00' '88.00' '46.00' '87.00' '90.00' '113.0' '200.0' '210.0' '193.0' '?' '100.0' '105.0' '175.0' '153.0' '180.0' '110.0' '72.00' '86.00' '70.00' '76.00' '65.00' '69.00' '60.00' '80.00' '54.00' '208.0' '155.0' '112.0' '92.00' '145.0' '137.0' '158.0' '167.0' '94.00' '107.0' '230.0' '49.00' '75.00' '91.00' '122.0' '67.00' '83.00' '78.00' '52.00' '61.00' '93.00' '148.0' '129.0' '96.00' '71.00' '98.00' '115.0' '53.00' '81.00' '79.00' '120.0' '152.0' '102.0' '108.0' '68.00' '58.00' '149.0' '89.00' '63.00' '48.00' '66.00' '139.0' '103.0' '125.0' '133.0' '138.0' '135.0' '142.0' '77.00' '62.00' '132.0' '84.00' '64.00' '74.00' '116.0' '82.00']

Q. horsepower 열의 누락 데이터'?'을 삭제한 후 NaN값의 갯수를 출력하세요.

In [20]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# 누락데이터 ('?') 삭제

import numpy as np

auto_df['horsepower'].replace('?', np.nan, inplace=True) #'?'을 np.nan으로 변경

auto_df.dropna(subset=['horsepower'], axis=0, inplace=True) # 누락데이터 행을 제거

 

print(auto_df['horsepower'].isnull().sum())

print(auto_df.horsepower.dtypes)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

0 object

Q. horsepower 문자열을 실수형으로 변환한 후 자료형을 확인하세요.

In [21]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

auto_df['horsepower'] = auto_df['horsepower'].astype('float')

print(auto_df['horsepower'].dtypes)

display(auto_df.head(3))

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

float64

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 4열 선택4열 다음에 열 추가
  • 5열 선택5열 다음에 열 추가
  • 6열 선택6열 다음에 열 추가
  • 7열 선택7열 다음에 열 추가
  • 8열 선택8열 다음에 열 추가
  • 9열 선택9열 다음에 열 추가
  • 10열 선택10열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가

열 너비 조절

행 높이 조절

 

mpg

cylinders

displacement

horsepower

weight

acceleration

model year

origin

name

kpl

0

18.0

8

307.0

130.0

3504.0

12.0

70

1

chevrolet chevelle malibu

7.65

1

15.0

8

350.0

165.0

3693.0

11.5

70

1

buick skylark 320

6.38

2

18.0

8

318.0

150.0

3436.0

11.0

70

1

plymouth satellite

7.65

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Q. 아래 사항을 처리하세요.

In [22]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# origin 열의 고유값 확인

print(auto_df['origin'].unique())

 

# 정수형 데이터를 문자형 데이터로 변환

auto_df['origin'].replace({1:'USA',2:'EU',3:'JAPAN'},inplace=True)

 

print(auto_df['origin'].unique())

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

[1 3 2] ['USA' 'JAPAN' 'EU']

Q. origin 열의 자료형을 확인하고 범주형으로 변환하여 출력하세요.

In [23]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# origin 열의 자료형 확인

print(auto_df['origin'].dtypes) # origin은 제조국을 지칭 -> 범주형 데이터

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

object

In [24]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# origin 열의 문자열 자료형을 범주형으로 변환

auto_df['origin'] = auto_df['origin'].astype('category')

print(auto_df['origin'].dtypes)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

category

Q. origin 열을 범주형에서 문자열로 변환한 후 자료형을 출력하세요.

In [25]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# 범주형을 문자열로 변환

auto_df['origin'] = auto_df['origin'].astype('object') # object = str 둘 다 명시해도 변환 가능

print(auto_df['origin'].dtypes)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

object

Q. model_year 열의 정수형을 범주형으로 변환한 후 출력하세요

In [26]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# auto_df['model year'].unique() : [70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82]

display(auto_df['model year'].sample(3))

auto_df['model year'] = auto_df['model year'].astype('category')

display(auto_df['model year'].sample(3))

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

286 79 42 71 326 80 Name: model year, dtype: int64

202 76 230 77 341 81 Name: model year, dtype: category Categories (13, int64): [70, 71, 72, 73, ..., 79, 80, 81, 82]

범주형(카테고리) 데이터 처리

In [27]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

auto_df['horsepower'].replace('?', np.nan, inplace=True) # ? 로 저장되어있는 데이터를 NaN 값으로 대체

auto_df.dropna(subset=['horsepower'], axis=0, inplace=True) # horsepower 컬럼에 결측치(NaN)가 있는 경우 삭제

auto_df['horsepower'] = auto_df['horsepower'].astype('float') # horsepower 열의 타입을 float64로 변경 후 대입

auto_df['hp'] = auto_df['horsepower'].astype('int') # horsepower 열의 타입을 int 로 변경 후 hp열을 추가하여 삽입

print()

auto_df.info()

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

<class 'pandas.core.frame.DataFrame'> Int64Index: 392 entries, 0 to 397 Data columns (total 11 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 mpg 392 non-null float64 1 cylinders 392 non-null int64 2 displacement 392 non-null float64 3 horsepower 392 non-null float64 4 weight 392 non-null float64 5 acceleration 392 non-null float64 6 model year 392 non-null category 7 origin 392 non-null object 8 name 392 non-null object 9 kpl 392 non-null float64 10 hp 392 non-null int32 dtypes: category(1), float64(6), int32(1), int64(1), object(2) memory usage: 33.3+ KB

In [43]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# np.histogram 함수로 3개의 bin으로 나누는 경계값의 리스트 구하기

count, bin_dividers = np.histogram(auto_df['horsepower'], bins=3) # 3개로 나누기 때문에 bins=3 (나누는 구간은 자동으로 정렬된다.)

print(count) # 각 구간별로 들어있는 데이터 수

display(bin_dividers) # [ 46. , 107.33333333, 168.66666667, 230.] : 46 ~ 107, 107 ~ 168, 168 ~ 230 총 3개 구간 확인 가능

print()

 

# 3개의 bin에 이름 지정

bin_names = ['저출력', '보통출력', '고출력'] # 3개로 나누었기 때문에 구간도 3개의 종류로 들어가야 한다.

 

# pd.cut 함수로 각 데이터를 3개의 bin에 할당

auto_df['hp_bin'] = pd.cut(x=auto_df['horsepower'], # 데이터 배열, 컬럼 추가하여 삽입

bins=bin_dividers, # 경계 값 리스트

labels=bin_names, # bin 이름

include_lowest=True) # 첫 경계값 포함

# include_lowest는 객체의 가장 작은 값을 포함 여부를 지정하는 것으로 기본값은 False로서 포함하지 않는다.

 

# horsepower 열, hp_bin 열의 첫 5행을 출력

display(auto_df[['horsepower', 'hp_bin']].head())

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

[257 103 32]

array([0. , 0.33333333, 0.66666667, 1. ])

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가
  • 4행 선택4행 다음에 행 추가
  • 5행 선택5행 다음에 행 추가

열 너비 조절

행 높이 조절

 

horsepower

hp_bin

0

0.456522

보통출력

1

0.646739

보통출력

2

0.565217

보통출력

3

0.565217

보통출력

4

0.510870

보통출력

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

더미 변수

카테고리를 나타내는 범주형 데이터를 회귀분석 등 ml 알고리즘에 바로 사용할 수 없는 경우

컴퓨터가 인식 가능한 입력값으로 변환 -> 숫자 0 또는 1로 표현되는 더미 변수 사용.

0, 1은 크고 작음과 상관없고 어떤 특성 여부만 표시(존재1, 비존재0) -> one-hot-encoding(one hot vector로 변환한다는 의미)

In [29]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# hp_bin 열의 범주형 데이터를 더미 변수로 변환

horsepower_dummies = pd.get_dummies(auto_df['hp_bin'])

horsepower_dummies.head(15)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Out[29]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가
  • 4행 선택4행 다음에 행 추가
  • 5행 선택5행 다음에 행 추가
  • 6행 선택6행 다음에 행 추가
  • 7행 선택7행 다음에 행 추가
  • 8행 선택8행 다음에 행 추가
  • 9행 선택9행 다음에 행 추가
  • 10행 선택10행 다음에 행 추가
  • 11행 선택11행 다음에 행 추가
  • 12행 선택12행 다음에 행 추가
  • 13행 선택13행 다음에 행 추가
  • 14행 선택14행 다음에 행 추가
  • 15행 선택15행 다음에 행 추가

열 너비 조절

행 높이 조절

 

저출력

보통출력

고출력

0

0

1

0

1

0

1

0

2

0

1

0

3

0

1

0

4

0

1

0

5

0

0

1

6

0

0

1

7

0

0

1

8

0

0

1

9

0

0

1

10

0

0

1

11

0

1

0

12

0

1

0

13

0

0

1

14

1

0

0

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

In [47]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# sklearn 라이브러리 불러오기

from sklearn import preprocessing

 

# 전처리를 위한 encoder 객체 만들기

label_encoder = preprocessing.LabelEncoder()

onehot_encoder = preprocessing.OneHotEncoder()

 

display(auto_df.head())

 

# label encoder로 문자열 범주를 숫자형 범주로 변환

onehot_labeled = label_encoder.fit_transform(auto_df['hp_bin'].head(15))

display(onehot_labeled)

print(type(onehot_labeled))

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 4열 선택4열 다음에 열 추가
  • 5열 선택5열 다음에 열 추가
  • 6열 선택6열 다음에 열 추가
  • 7열 선택7열 다음에 열 추가
  • 8열 선택8열 다음에 열 추가
  • 9열 선택9열 다음에 열 추가
  • 10열 선택10열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가
  • 4행 선택4행 다음에 행 추가
  • 5행 선택5행 다음에 행 추가

열 너비 조절

행 높이 조절

 

mpg

cylinders

displacement

horsepower

weight

acceleration

model year

origin

name

hp_bin

0

18.0

8

307.0

0.456522

3504.0

12.0

70

1

chevrolet chevelle malibu

보통출력

1

15.0

8

350.0

0.646739

3693.0

11.5

70

1

buick skylark 320

보통출력

2

18.0

8

318.0

0.565217

3436.0

11.0

70

1

plymouth satellite

보통출력

3

16.0

8

304.0

0.565217

3433.0

12.0

70

1

amc rebel sst

보통출력

4

17.0

8

302.0

0.510870

3449.0

10.5

70

1

ford torino

보통출력

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

array([1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 2])

<class 'numpy.ndarray'>

In [31]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# 2차원 행렬로 형태 변경

onehot_reshaped = onehot_labeled.reshape(len(onehot_labeled),1)

print(onehot_reshaped)

print(type(onehot_reshaped))

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

[[1] [1] [1] [1] [1] [0] [0] [0] [0] [0] [0] [1] [1] [0] [2]] <class 'numpy.ndarray'>

In [32]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# 희소행렬로 변환

onehot_fitted = onehot_encoder.fit_transform(onehot_reshaped) # fit_transform : 희소행렬로 변환(fit을 먼저하고 transform 을 하기도 함)

print(onehot_fitted)

print(type(onehot_fitted))

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

(0, 1) 1.0 (1, 1) 1.0 (2, 1) 1.0 (3, 1) 1.0 (4, 1) 1.0 (5, 0) 1.0 (6, 0) 1.0 (7, 0) 1.0 (8, 0) 1.0 (9, 0) 1.0 (10, 0) 1.0 (11, 1) 1.0 (12, 1) 1.0 (13, 0) 1.0 (14, 2) 1.0 <class 'scipy.sparse.csr.csr_matrix'>

정규화

각 변수의 숫자 데이터의 상대적 크기 차이 때문에 ml 분석 결과가 달라질 수 있음.(a 변수 1 ~ 1000, b변수 0~1)

숫자 데이터의 상대적 크기 차이를 제거할 필요가 있으며 각 열(변수)에 속하는 데이터 값을 동일한 크기 기준으로 나누어 정규화 함

정규화 결과 데이터의 범위는 0 ~ 1 또는 -1 ~ 1(음수값이 있는 경우).

각 열의 값 / 최대값 or (각 열의 값 - 최소값) / (해당 열의 최대값 - 최소값)

표준화

평균이 0 이고 분산(or 표준편차) 이 1인 가우시안 표준 정규분포를 가진 값으로 변환하는 것

In [33]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# horsepower 열의 누락 데이터('?') 삭제하고 실수형으로 변환

auto_df = pd.read_csv('auto-mpg.csv', header=None)

auto_df.columns = ['mpg','cylinders','displacement','horsepower','weight','acceleration','model year','origin','name']

auto_df['horsepower'].replace('?', np.nan, inplace=True) #'?'을 np.nan으로 변경

auto_df.dropna(subset=['horsepower'], axis=0, inplace=True) # 누락데이터 행을 제거

auto_df['horsepower'] = auto_df['horsepower'].astype('float') # 문자열을 실수형으로 변경

 

#horsepower 열의 통계 요약정보로 최대값(max)을 확인

print(auto_df.horsepower.describe())

print()

 

# horsepower 열의 최대값의 절대값으로 모든 데이터를 나눠서 저장

 

auto_df.horsepower = auto_df.horsepower / abs(auto_df.horsepower.max())

 

print(auto_df.horsepower.head())

print()

print(auto_df.horsepower.describe())

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

count 392.000000 mean 104.469388 std 38.491160 min 46.000000 25% 75.000000 50% 93.500000 75% 126.000000 max 230.000000 Name: horsepower, dtype: float64 0 0.565217 1 0.717391 2 0.652174 3 0.652174 4 0.608696 Name: horsepower, dtype: float64 count 392.000000 mean 0.454215 std 0.167353 min 0.200000 25% 0.326087 50% 0.406522 75% 0.547826 max 1.000000 Name: horsepower, dtype: float64

In [34]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# read_csv() 함수로 df 생성

auto_df = pd.read_csv('auto-mpg.csv', header=None)

auto_df.columns = ['mpg','cylinders','displacement','horsepower','weight','acceleration','model year','origin','name']

 

#horsepower 열의 누락 데이터('?') 삭제하고 실수형으로 변환

auto_df['horsepower'].replace('?', np.nan, inplace=True) #'?'을 np.nan으로 변경

auto_df.dropna(subset=['horsepower'], axis=0, inplace=True) # 누락데이터 행을 제거

auto_df['horsepower'] = auto_df['horsepower'].astype('float') # 문자열을 실수형으로 변환

 

# horsepower 열의 통계 요약정보로 최대값 (max)과 최소값(min)을 확인

print(auto_df.horsepower.describe())

print()

 

# horsepower 각 열 데이터에서 해당 열의 최소값을 뺀 값을 분자, 해당 열의 최대값 - 최소값을 분모

# 가장 큰 값은 역시 1

 

min_x = auto_df.horsepower - auto_df.horsepower.min()

min_max = auto_df.horsepower.max() - auto_df.horsepower.min()

auto_df.horsepower = min_x / min_max

 

print(auto_df.horsepower.head())

print()

print(auto_df.horsepower.describe())

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

count 392.000000 mean 104.469388 std 38.491160 min 46.000000 25% 75.000000 50% 93.500000 75% 126.000000 max 230.000000 Name: horsepower, dtype: float64 0 0.456522 1 0.646739 2 0.565217 3 0.565217 4 0.510870 Name: horsepower, dtype: float64 count 392.000000 mean 0.317768 std 0.209191 min 0.000000 25% 0.157609 50% 0.258152 75% 0.434783 max 1.000000 Name: horsepower, dtype: float64

 

 

 


추가문제

Q. titanic_df의 각 칼럼별 null의 갯수를 for 반복문을 사용해서 구한 후 출력하세요.

(missing_count는 예외처리 하고 처리 방식은 0 을 출력함)

In [1]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

import seaborn as sns

import pandas as pd

import numpy as np

 

titanic_df = sns.load_dataset('titanic')

try:

for column in titanic_df.columns :

print(column,titanic_df[column].isnull().sum(axis=0))

except IndexError as e:

print('인덱스에러',e) # 1번 방법

 

# 2번 방법

# for i in range(len(titanic_df)):

# print(titanic_df.iloc[:,i].isnull().sum())

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

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

데이터 소스 : titanic_df = sns.load_dataset('titanic')

Q. embark_town 열의 829행의 NaN 데이터의 앞, 뒤를 포함하는 3개행을 출력하세요.

In [2]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

import seaborn as sns

import pandas as pd

import numpy as np

titanic_df = sns.load_dataset('titanic')

display(titanic_df.head(3))

print(titanic_df.embark_town.iloc[828:831],'\n')

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 4열 선택4열 다음에 열 추가
  • 5열 선택5열 다음에 열 추가
  • 6열 선택6열 다음에 열 추가
  • 7열 선택7열 다음에 열 추가
  • 8열 선택8열 다음에 열 추가
  • 9열 선택9열 다음에 열 추가
  • 10열 선택10열 다음에 열 추가
  • 11열 선택11열 다음에 열 추가
  • 12열 선택12열 다음에 열 추가
  • 13열 선택13열 다음에 열 추가
  • 14열 선택14열 다음에 열 추가
  • 15열 선택15열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가

열 너비 조절

행 높이 조절

 

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

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

828 Queenstown 829 NaN 830 Cherbourg Name: embark_town, dtype: object

Q. embark_town 열의 NaN값을 승선도시 중에서 가장 많이 출현한 값으로 대체하세요.

In [3]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

nan_embark_town = titanic_df['embark_town'].value_counts(dropna=False)

display(nan_embark_town) # 가장 많이 출현한 값 : Southampton

 

titanic_df['embark_town'].replace(np.nan, 'Southampton', inplace=True)

titanic_df.dropna(subset=['embark_town'], axis=0, inplace=True)

titanic_df.embark_town.value_counts()

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Southampton 644 Cherbourg 168 Queenstown 77 NaN 2 Name: embark_town, dtype: int64

Out[3]:

Southampton 646 Cherbourg 168 Queenstown 77 Name: embark_town, dtype: int64

Q. titanic_df에서 'age' 열에 나이 데이터가 없는 모든 행을 삭제 후 df_age 이름으로 저장하고 행의 갯수를 구하세요. 데이터 소스 : titanic_df = sns.load_dataset('titanic')

In [4]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

titanic_df = sns.load_dataset('titanic')

display(titanic_df['age'].isnull().sum()) # 나이데이터에 NaN 수

df_age = titanic_df.dropna(how='any',subset=['age'])

df_age.shape # 행의 갯수 714개

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

177

Out[4]:

(714, 15)

Q. age 열의 NaN값을 다른 나이 데이터의 평균으로 변경한 후 'age' 열의 첫 10개 데이터만 정수로 출력하세요.

In [5]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

print('평균값:',titanic_df['age'].mean())

titanic_df['age'].replace(np.nan, titanic_df['age'].mean(), inplace=True)

titanic_df['age'].head(10).astype('int')

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

평균값: 29.69911764705882

Out[5]:

0 22 1 38 2 26 3 35 4 35 5 29 6 54 7 2 8 27 9 14 Name: age, dtype: int32

Q. 1 ~ 2사이의 정수로 (5,3) 2차원 배열을 랜덤하게 만든 후 DataFrame으로 불러와 df에 저장하고 df에서 중복 행을 제거한 후 df2에 저장 후 출력하세요.(columns = ['a','b','c'])

In [6]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

df = pd.DataFrame(np.random.randint(1,2,size=(5,3)), columns=['a','b','c'])

display(df)

df2 = df.drop_duplicates()

display(df2)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가
  • 4행 선택4행 다음에 행 추가
  • 5행 선택5행 다음에 행 추가

열 너비 조절

행 높이 조절

 

a

b

c

0

1

1

1

1

1

1

1

2

1

1

1

3

1

1

1

4

1

1

1

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가

열 너비 조절

행 높이 조절

 

a

b

c

0

1

1

1

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Q. df에서 b, c열을 기준으로 중복 행을 제거한 후 df3에 저장하고 출력하세요.

In [7]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

df3=df.drop_duplicates(subset=['b','c'])

df3

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Out[7]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가

열 너비 조절

행 높이 조절

 

a

b

c

0

1

1

1

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Q. titanic_df embark_town 열의 NaN값을 바로 앞에 있는 830행의 값으로 변경한 후 출력하세요.

In [8]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

titanic_df = sns.load_dataset('titanic')

display(titanic_df.embark_town.iloc[828:831])

titanic_df['embark_town'].fillna(method='bfill', inplace=True)

display(titanic_df.embark_town.iloc[828:831])

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

828 Queenstown 829 NaN 830 Cherbourg Name: embark_town, dtype: object

828 Queenstown 829 Cherbourg 830 Cherbourg Name: embark_town, dtype: object

In [9]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# 데이터 프레임 생성

import pandas as pd

auto_df = pd.read_csv('auto-mpg.csv', header=None)

auto_df.columns = ['mpg','cylinders','displacement','horsepower','weight','acceleration','model year','origin','name']

 

auto_df.head(3)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Out[9]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 4열 선택4열 다음에 열 추가
  • 5열 선택5열 다음에 열 추가
  • 6열 선택6열 다음에 열 추가
  • 7열 선택7열 다음에 열 추가
  • 8열 선택8열 다음에 열 추가
  • 9열 선택9열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가

열 너비 조절

행 높이 조절

 

mpg

cylinders

displacement

horsepower

weight

acceleration

model year

origin

name

0

18.0

8

307.0

130.0

3504.0

12.0

70

1

chevrolet chevelle malibu

1

15.0

8

350.0

165.0

3693.0

11.5

70

1

buick skylark 320

2

18.0

8

318.0

150.0

3436.0

11.0

70

1

plymouth satellite

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Q. horsepower 열의 누락 데이터 '?'을 삭제한 후 NaN 값의 갯수를 출력하세요.

In [10]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

auto_df['horsepower'].replace('?', np.nan, inplace=True) # ?값을 NaN 으로 대체

auto_df.dropna(subset=['horsepower'], axis=0, inplace=True) # 누락된 데이터 삭제

auto_df['horsepower'].isnull().sum()

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Out[10]:

0

Q. horsepower 열의 누락 데이터('?') 삭제하고 실수형으로 변환하세요.

In [11]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

auto_df['horsepower'] = auto_df['horsepower'].astype('float')

auto_df['horsepower'].head()

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Out[11]:

0 130.0 1 165.0 2 150.0 3 150.0 4 140.0 Name: horsepower, dtype: float64

Q. Titanic 가공한 내역을 정리하고 이를 쉽게 재사용할 후 있도록 종합 전처리 함수를 만드세요.(def transform_features(df):)

In [23]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# titanic_df = sns.load_dataset('titanic')

# 앞에서 설정한 Data Preprocessing 함수 호출

 

from sklearn.preprocessing import LabelEncoder

import numpy as np

import pandas as pd

import seaborn as sns

import warnings

warnings.filterwarnings('ignore')

 

# Null 처리 함수

def fillna(df):

df['Age'].fillna(df['Age'].mean(), inplace=True)

df['Cabin'].fillna('N', inplace=True)

df['Embarked'].fillna('N', inplace=True)

return df

 

# 머신러닝 알고리즘에 불필요한 속성 제거(PassengerId, Name, Ticket)

def drop_features(df):

df.drop(['PassengerId','Name','Ticket'], axis=1, inplace=True)

return df

 

# 레이블 인코딩

def format_features(df):

df['Cabin'] = df['Cabin'].str[:1]

features = ['Cabin','Sex','Embarked']

for feature in features:

le = LabelEncoder()

# le = le.fit(df[feature])

df[feature] = le.fit_transform(df[feature])

return df

 

# 앞에서 설정한 Data Preprocessing 함수 호출

def transform_features(df):

df = fillna(df)

df = drop_features(df)

df = format_features(df)

return df

 

titanic_df = pd.read_csv('train_df.csv')

transform_features(titanic_df.head())

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Out[23]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 4열 선택4열 다음에 열 추가
  • 5열 선택5열 다음에 열 추가
  • 6열 선택6열 다음에 열 추가
  • 7열 선택7열 다음에 열 추가
  • 8열 선택8열 다음에 열 추가
  • 9열 선택9열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가
  • 4행 선택4행 다음에 행 추가
  • 5행 선택5행 다음에 행 추가

열 너비 조절

행 높이 조절

 

Survived

Pclass

Sex

Age

SibSp

Parch

Fare

Cabin

Embarked

0

0

3

1

22.0

1

0

7.2500

1

1

1

1

1

0

38.0

1

0

71.2833

0

0

2

1

3

0

26.0

0

0

7.9250

1

1

3

1

1

0

35.0

1

0

53.1000

0

1

4

0

3

1

35.0

0

0

8.0500

1

1

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

 

 

728x90
반응형

댓글