10 분 소요

import warnings
warnings.filterwarnings('ignore')
from IPython.display import Image
import numpy as np
import pandas as pd
#Pew Research Center는 세계의 여론 조사, 인구 통계 
#등 다양한 사회 과학 연구를 수행하는 곳이다.
#Pew Research Center에서 조사한 '미국의 소득과 종교'
#데이터를 사용한다.
pew = pd.read_csv('./data/pew.csv')
pew
religion <$10k $10-20k $20-30k $30-40k $40-50k $50-75k $75-100k $100-150k >150k Don't know/refused
0 Agnostic 27 34 60 81 76 137 122 109 84 96
1 Atheist 12 27 37 52 35 70 73 59 74 76
2 Buddhist 27 21 30 34 33 58 62 39 53 54
3 Catholic 418 617 732 670 638 1116 949 792 633 1489
4 Don’t know/refused 15 14 15 11 10 35 21 17 18 116
5 Evangelical Prot 575 869 1064 982 881 1486 949 723 414 1529
6 Hindu 1 9 7 9 11 34 47 48 54 37
7 Historically Black Prot 228 244 236 238 197 223 131 81 78 339
8 Jehovah's Witness 20 27 24 24 21 30 15 11 6 37
9 Jewish 19 19 25 25 30 95 69 87 151 162
10 Mainline Prot 289 495 619 655 651 1107 939 753 634 1328
11 Mormon 29 40 48 51 56 112 85 49 42 69
12 Muslim 6 7 9 10 9 23 16 8 6 22
13 Orthodox 13 17 23 32 32 47 38 42 46 73
14 Other Christian 9 7 11 13 13 14 18 14 12 18
15 Other Faiths 20 33 40 46 49 63 46 40 41 71
16 Other World Religions 5 2 3 4 2 7 3 4 4 8
17 Unaffiliated 217 299 374 365 341 528 407 321 258 597
#melt() 함수
#데이터프레임을 깔끔한 데이터로 정리하는데 사용하는 melt() 함수는 지정한 열의 데이터를 모두 행으로 정리한다.
#melt(데이터프레임, id_vars[, value_vars, var_name, value_name])
#id_vars => 위치를 그대로 유지할 열 이름
#value_vars => 행으로 위치를 변경할 열 이름
#var_name => value_vars로 위치를 변경한 열 이름을 지정한다.
#value_name => var_name으로 위치를 변경한 열의 데이터를 지정한 열 이름을 지정한다.
#소득 정보가 열을 구성하고 있다. => 소득 정보 열을 행 데이터로 옮긴다.
#id_vars 속성으로 지정한 열(religion)을 제외한 나머지 소득 정보 열(
#<$10k,$10-20k,$20-30k,...Don't know/refused)이 varaible열로, 소득 정보
#열의 데이터는 value열로 정리가 되고 value_vars를 생략하면 모든 열을
#대상으로 함수가 실행된다.

#이런 과정을 'religion'열을 고정해서 '피벗했다'라고 말한다.

per_long=pd.melt(pew, id_vars='religion')
per_long.head(50)
religion variable value
0 Agnostic <$10k 27
1 Atheist <$10k 12
2 Buddhist <$10k 27
3 Catholic <$10k 418
4 Don’t know/refused <$10k 15
5 Evangelical Prot <$10k 575
6 Hindu <$10k 1
7 Historically Black Prot <$10k 228
8 Jehovah's Witness <$10k 20
9 Jewish <$10k 19
10 Mainline Prot <$10k 289
11 Mormon <$10k 29
12 Muslim <$10k 6
13 Orthodox <$10k 13
14 Other Christian <$10k 9
15 Other Faiths <$10k 20
16 Other World Religions <$10k 5
17 Unaffiliated <$10k 217
18 Agnostic $10-20k 34
19 Atheist $10-20k 27
20 Buddhist $10-20k 21
21 Catholic $10-20k 617
22 Don’t know/refused $10-20k 14
23 Evangelical Prot $10-20k 869
24 Hindu $10-20k 9
25 Historically Black Prot $10-20k 244
26 Jehovah's Witness $10-20k 27
27 Jewish $10-20k 19
28 Mainline Prot $10-20k 495
29 Mormon $10-20k 40
30 Muslim $10-20k 7
31 Orthodox $10-20k 17
32 Other Christian $10-20k 7
33 Other Faiths $10-20k 33
34 Other World Religions $10-20k 2
35 Unaffiliated $10-20k 299
36 Agnostic $20-30k 60
37 Atheist $20-30k 37
38 Buddhist $20-30k 30
39 Catholic $20-30k 732
40 Don’t know/refused $20-30k 15
41 Evangelical Prot $20-30k 1064
42 Hindu $20-30k 7
43 Historically Black Prot $20-30k 236
44 Jehovah's Witness $20-30k 24
45 Jewish $20-30k 25
46 Mainline Prot $20-30k 619
47 Mormon $20-30k 48
48 Muslim $20-30k 9
49 Orthodox $20-30k 23
#value_vars 속성을 지정하면 지정한 열만 대상으로 피벗한다.
per_long = pd.melt(pew, id_vars='religion', value_vars='$20-30k')
per_long
religion variable value
0 Agnostic $20-30k 60
1 Atheist $20-30k 37
2 Buddhist $20-30k 30
3 Catholic $20-30k 732
4 Don’t know/refused $20-30k 15
5 Evangelical Prot $20-30k 1064
6 Hindu $20-30k 7
7 Historically Black Prot $20-30k 236
8 Jehovah's Witness $20-30k 24
9 Jewish $20-30k 25
10 Mainline Prot $20-30k 619
11 Mormon $20-30k 48
12 Muslim $20-30k 9
13 Orthodox $20-30k 23
14 Other Christian $20-30k 11
15 Other Faiths $20-30k 40
16 Other World Religions $20-30k 3
17 Unaffiliated $20-30k 374
per_long = pd.melt(pew, id_vars='religion', value_vars=['$10-20k','$100-150k'])
per_long
religion variable value
0 Agnostic $10-20k 34
1 Atheist $10-20k 27
2 Buddhist $10-20k 21
3 Catholic $10-20k 617
4 Don’t know/refused $10-20k 14
5 Evangelical Prot $10-20k 869
6 Hindu $10-20k 9
7 Historically Black Prot $10-20k 244
8 Jehovah's Witness $10-20k 27
9 Jewish $10-20k 19
10 Mainline Prot $10-20k 495
11 Mormon $10-20k 40
12 Muslim $10-20k 7
13 Orthodox $10-20k 17
14 Other Christian $10-20k 7
15 Other Faiths $10-20k 33
16 Other World Religions $10-20k 2
17 Unaffiliated $10-20k 299
18 Agnostic $100-150k 109
19 Atheist $100-150k 59
20 Buddhist $100-150k 39
21 Catholic $100-150k 792
22 Don’t know/refused $100-150k 17
23 Evangelical Prot $100-150k 723
24 Hindu $100-150k 48
25 Historically Black Prot $100-150k 81
26 Jehovah's Witness $100-150k 11
27 Jewish $100-150k 87
28 Mainline Prot $100-150k 753
29 Mormon $100-150k 49
30 Muslim $100-150k 8
31 Orthodox $100-150k 42
32 Other Christian $100-150k 14
33 Other Faiths $100-150k 40
34 Other World Religions $100-150k 4
35 Unaffiliated $100-150k 321
#var_name 속성을 이용해서 variable로 표시되던 열 이름을 변경한다.
#value_name 속성을 이용해서 value로 표시되던 열 이름을 변경한다.
per_long = pd.melt(pew, id_vars='religion', value_vars=['$10-20k','$100-150k'], 
                   var_name='최저임금', value_name="인원수")
per_long
religion 최저임금 인원수
0 Agnostic $10-20k 34
1 Atheist $10-20k 27
2 Buddhist $10-20k 21
3 Catholic $10-20k 617
4 Don’t know/refused $10-20k 14
5 Evangelical Prot $10-20k 869
6 Hindu $10-20k 9
7 Historically Black Prot $10-20k 244
8 Jehovah's Witness $10-20k 27
9 Jewish $10-20k 19
10 Mainline Prot $10-20k 495
11 Mormon $10-20k 40
12 Muslim $10-20k 7
13 Orthodox $10-20k 17
14 Other Christian $10-20k 7
15 Other Faiths $10-20k 33
16 Other World Religions $10-20k 2
17 Unaffiliated $10-20k 299
18 Agnostic $100-150k 109
19 Atheist $100-150k 59
20 Buddhist $100-150k 39
21 Catholic $100-150k 792
22 Don’t know/refused $100-150k 17
23 Evangelical Prot $100-150k 723
24 Hindu $100-150k 48
25 Historically Black Prot $100-150k 81
26 Jehovah's Witness $100-150k 11
27 Jewish $100-150k 87
28 Mainline Prot $100-150k 753
29 Mormon $100-150k 49
30 Muslim $100-150k 8
31 Orthodox $100-150k 42
32 Other Christian $100-150k 14
33 Other Faiths $100-150k 40
34 Other World Religions $100-150k 4
35 Unaffiliated $100-150k 321
per_long = pd.melt(pew, id_vars='religion', value_vars=['$10-20k','$100-150k'])
per_long.columns = ["종교", "최저임금", "인원수"]
per_long
종교 최저임금 인원수
0 Agnostic $10-20k 34
1 Atheist $10-20k 27
2 Buddhist $10-20k 21
3 Catholic $10-20k 617
4 Don’t know/refused $10-20k 14
5 Evangelical Prot $10-20k 869
6 Hindu $10-20k 9
7 Historically Black Prot $10-20k 244
8 Jehovah's Witness $10-20k 27
9 Jewish $10-20k 19
10 Mainline Prot $10-20k 495
11 Mormon $10-20k 40
12 Muslim $10-20k 7
13 Orthodox $10-20k 17
14 Other Christian $10-20k 7
15 Other Faiths $10-20k 33
16 Other World Religions $10-20k 2
17 Unaffiliated $10-20k 299
18 Agnostic $100-150k 109
19 Atheist $100-150k 59
20 Buddhist $100-150k 39
21 Catholic $100-150k 792
22 Don’t know/refused $100-150k 17
23 Evangelical Prot $100-150k 723
24 Hindu $100-150k 48
25 Historically Black Prot $100-150k 81
26 Jehovah's Witness $100-150k 11
27 Jewish $100-150k 87
28 Mainline Prot $100-150k 753
29 Mormon $100-150k 49
30 Muslim $100-150k 8
31 Orthodox $100-150k 42
32 Other Christian $100-150k 14
33 Other Faiths $100-150k 40
34 Other World Religions $100-150k 4
35 Unaffiliated $100-150k 321
ebola = pd.read_csv("./data/country_timeseries.csv")
ebola.head()
Date Day Cases_Guinea Cases_Liberia Cases_SierraLeone Cases_Nigeria Cases_Senegal Cases_UnitedStates Cases_Spain Cases_Mali Deaths_Guinea Deaths_Liberia Deaths_SierraLeone Deaths_Nigeria Deaths_Senegal Deaths_UnitedStates Deaths_Spain Deaths_Mali
0 1/5/2015 289 2776.0 NaN 10030.0 NaN NaN NaN NaN NaN 1786.0 NaN 2977.0 NaN NaN NaN NaN NaN
1 1/4/2015 288 2775.0 NaN 9780.0 NaN NaN NaN NaN NaN 1781.0 NaN 2943.0 NaN NaN NaN NaN NaN
2 1/3/2015 287 2769.0 8166.0 9722.0 NaN NaN NaN NaN NaN 1767.0 3496.0 2915.0 NaN NaN NaN NaN NaN
3 1/2/2015 286 NaN 8157.0 NaN NaN NaN NaN NaN NaN NaN 3496.0 NaN NaN NaN NaN NaN NaN
4 12/31/2014 284 2730.0 8115.0 9633.0 NaN NaN NaN NaN NaN 1739.0 3471.0 2827.0 NaN NaN NaN NaN NaN
#ebola_sub_set=ebola.iloc[:, [0,1,2,3, 10,11]]
ebola_sub_set = ebola.loc[:, ['Date','Day','Cases_Guinea','Cases_Liberia', 'Deaths_Guinea', 'Deaths_Liberia']]
ebola_sub_set.head()
Date Day Cases_Guinea Cases_Liberia Deaths_Guinea Deaths_Liberia
0 1/5/2015 289 2776.0 NaN 1786.0 NaN
1 1/4/2015 288 2775.0 NaN 1781.0 NaN
2 1/3/2015 287 2769.0 8166.0 1767.0 3496.0
3 1/2/2015 286 NaN 8157.0 NaN 3496.0
4 12/31/2014 284 2730.0 8115.0 1739.0 3471.0
#Date와 Days를 고정하고 나머지를 행으로 피벗하면
#각 나라별 환자 수와 사망자 수를 볼 수 있다.
ebola_long = pd.melt(ebola_sub_set, id_vars=['Date', 'Day'])
ebola_long.columns = ['날짜', '경과일', '국가명', '인원수']
ebola_long
날짜 경과일 국가명 인원수
0 1/5/2015 289 Cases_Guinea 2776.0
1 1/4/2015 288 Cases_Guinea 2775.0
2 1/3/2015 287 Cases_Guinea 2769.0
3 1/2/2015 286 Cases_Guinea NaN
4 12/31/2014 284 Cases_Guinea 2730.0
... ... ... ... ...
483 3/27/2014 5 Deaths_Liberia 6.0
484 3/26/2014 4 Deaths_Liberia NaN
485 3/25/2014 3 Deaths_Liberia NaN
486 3/24/2014 2 Deaths_Liberia NaN
487 3/22/2014 0 Deaths_Liberia NaN

488 rows × 4 columns

#split()함수의 인수에 '_'를 구분자로 전달하면
#'Cases_Guinea'를 'Cases'와 'Guinea'로 분리할 수 있다.

print(type(ebola_long['국가명']))
print(type(ebola_long.국가명))

#split()은 문자열 데이터에 사용하는 함수다.
#시리즈에는 문자열 함수를 사용할 수 없으므로
#str을 사용해서 문자열로 변환한 후 사용한다.
print(type(ebola_long['국가명'].str))
print(type(ebola_long.국가명.str))

variable_split = ebola_long['국가명'].str.split('_')
print('='*80)

#분리된 데이터 전체는 시리즈 타입의 데이터이다.
print(type(variable_split))
print(variable_split.head())
print('='*80)

#분리된 데이터에서 특정 위치의 데이터만 얻어오려면
#리스트 타입의 데이터이다.(시리즈 내에 자료는 리스트들로 구성)
print(type(variable_split[0]))
#print(variable_split[300])도 해보자
print(variable_split[0])
print(variable_split[0][0])   #상태
print(variable_split[0][1])   #국가명

<class 'pandas.core.series.Series'>
<class 'pandas.core.series.Series'>
<class 'pandas.core.strings.StringMethods'>
<class 'pandas.core.strings.StringMethods'>
================================================================================
<class 'pandas.core.series.Series'>
0    [Cases, Guinea]
1    [Cases, Guinea]
2    [Cases, Guinea]
3    [Cases, Guinea]
4    [Cases, Guinea]
Name: 국가명, dtype: object
================================================================================
<class 'list'>
['Cases', 'Guinea']
Cases
Guinea
print(type(variable_split))
print(variable_split.head())
print('='*80)
print(variable_split.str[0].head())  #상태
print('='*80)
print(variable_split.str[1].head())  #국가
print('='*80)
print(variable_split.str.get(0).head())  #상태
print('='*80)
print(variable_split.str.get(1).head())  #국가
<class 'pandas.core.series.Series'>
0    [Cases, Guinea]
1    [Cases, Guinea]
2    [Cases, Guinea]
3    [Cases, Guinea]
4    [Cases, Guinea]
Name: 국가명, dtype: object
================================================================================
0    Cases
1    Cases
2    Cases
3    Cases
4    Cases
Name: 국가명, dtype: object
================================================================================
0    Guinea
1    Guinea
2    Guinea
3    Guinea
4    Guinea
Name: 국가명, dtype: object
================================================================================
0    Cases
1    Cases
2    Cases
3    Cases
4    Cases
Name: 국가명, dtype: object
================================================================================
0    Guinea
1    Guinea
2    Guinea
3    Guinea
4    Guinea
Name: 국가명, dtype: object
status_values = variable_split.str[0]
print(status_values.head())
print()
country_values = variable_split.str.get(1)
print(country_values.head())
0    Cases
1    Cases
2    Cases
3    Cases
4    Cases
Name: 국가명, dtype: object

0    Guinea
1    Guinea
2    Guinea
3    Guinea
4    Guinea
Name: 국가명, dtype: object
print(ebola_long.columns)
ebola_long['상태'] = status_values
ebola_long['국가'] = country_values
ebola_long
Index(['날짜', '경과일', '국가명', '인원수'], dtype='object')
날짜 경과일 국가명 인원수 상태 국가
0 1/5/2015 289 Cases_Guinea 2776.0 Cases Guinea
1 1/4/2015 288 Cases_Guinea 2775.0 Cases Guinea
2 1/3/2015 287 Cases_Guinea 2769.0 Cases Guinea
3 1/2/2015 286 Cases_Guinea NaN Cases Guinea
4 12/31/2014 284 Cases_Guinea 2730.0 Cases Guinea
... ... ... ... ... ... ...
483 3/27/2014 5 Deaths_Liberia 6.0 Deaths Liberia
484 3/26/2014 4 Deaths_Liberia NaN Deaths Liberia
485 3/25/2014 3 Deaths_Liberia NaN Deaths Liberia
486 3/24/2014 2 Deaths_Liberia NaN Deaths Liberia
487 3/22/2014 0 Deaths_Liberia NaN Deaths Liberia

488 rows × 6 columns

variable_split = ebola_long.국가명.str.split('_')
print(type(variable_split))

#까먹지 말아야 할것
#split()함수에 expend 옵션을 True로 지정하면 구분자를
#경계로 분리한 데이터를 하나의 데이터프레임으로 리턴한다.
#(False가 기본값)
variable_split = ebola_long.국가명.str.split('_', expand=True)
print(type(variable_split))
variable_split.head()

#열이름을 설정한다.
variable_split.columns=['상태2', '국가2']
variable_split.head()
<class 'pandas.core.series.Series'>
<class 'pandas.core.frame.DataFrame'>
상태2 국가2
0 Cases Guinea
1 Cases Guinea
2 Cases Guinea
3 Cases Guinea
4 Cases Guinea
ebola_parsed = pd.concat([ebola_long, variable_split], axis=1)
ebola_parsed
날짜 경과일 국가명 인원수 상태 국가 상태2 국가2
0 1/5/2015 289 Cases_Guinea 2776.0 Cases Guinea Cases Guinea
1 1/4/2015 288 Cases_Guinea 2775.0 Cases Guinea Cases Guinea
2 1/3/2015 287 Cases_Guinea 2769.0 Cases Guinea Cases Guinea
3 1/2/2015 286 Cases_Guinea NaN Cases Guinea Cases Guinea
4 12/31/2014 284 Cases_Guinea 2730.0 Cases Guinea Cases Guinea
... ... ... ... ... ... ... ... ...
483 3/27/2014 5 Deaths_Liberia 6.0 Deaths Liberia Deaths Liberia
484 3/26/2014 4 Deaths_Liberia NaN Deaths Liberia Deaths Liberia
485 3/25/2014 3 Deaths_Liberia NaN Deaths Liberia Deaths Liberia
486 3/24/2014 2 Deaths_Liberia NaN Deaths Liberia Deaths Liberia
487 3/22/2014 0 Deaths_Liberia NaN Deaths Liberia Deaths Liberia

488 rows × 8 columns

댓글남기기