9_판다스5
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
댓글남기기