[데이터 정제, 데이터 연결, 누락값, NaN, None, 누락값 대체, 누락값 삭제, 미주별 인구, datetime]
(1) 동일한 컬럼 데이타프레임 합치기¶
ex) 로그파일 등
In [9]:
import pandas as pd
df01 = pd.read_csv("data/transaction/201701.csv")
print(df01.head())
print('*' * 50)
df02 = pd.read_csv("data/transaction/201702.csv")
print(df02.head())
Name date amount product result
0 Kang 2017-01-01 500 apple confirmed
1 Kim 2017-01-03 700 banana confirmed
2 Choi 2017-01-05 800 apple confirmed
3 Park 2017-01-07 500 cereal canceled
4 Kang 2017-01-08 1200 kiwi confirmed
**************************************************
Name date amount product result
0 Kim 2017-02-04 100 cereal confirmed
1 Kang 2017-02-12 200 kiwi canceled
2 Kang 2017-02-15 650 banana confirmed
3 Park 2017-02-28 420 cereal confirmed
In [11]:
df = pd.concat([df01, df02]) #쪼개져 있는 두개의 데이터프레임을 합칠 때 ->문제도 있음 index - > 즉 동일한 컬럼일 때
df
Out[11]:
Name | date | amount | product | result | |
---|---|---|---|---|---|
0 | Kang | 2017-01-01 | 500 | apple | confirmed |
1 | Kim | 2017-01-03 | 700 | banana | confirmed |
2 | Choi | 2017-01-05 | 800 | apple | confirmed |
3 | Park | 2017-01-07 | 500 | cereal | canceled |
4 | Kang | 2017-01-08 | 1200 | kiwi | confirmed |
5 | Choi | 2017-01-09 | 100 | melon | confirmed |
6 | Lee | 2017-01-09 | 700 | banana | confirmed |
7 | Yoon | 2017-01-10 | 200 | cereal | canceled |
0 | Kim | 2017-02-04 | 100 | cereal | confirmed |
1 | Kang | 2017-02-12 | 200 | kiwi | canceled |
2 | Kang | 2017-02-15 | 650 | banana | confirmed |
3 | Park | 2017-02-28 | 420 | cereal | confirmed |
(2) 다른 컬럼을 가지고 있는 데이타프레임 합치기¶
In [12]:
import pandas as pd
# 1. 데이타 가져오기
person = pd.read_csv('./data/survey_person.csv')
print(person.head())
site = pd.read_csv('./data/survey_site.csv')
print(site.head())
survey = pd.read_csv('./data/survey_survey.csv')
print(survey.head())
visited = pd.read_csv('./data/survey_visited.csv')
print(visited.head())
ident personal family
0 dyer William Dyer
1 pb Frank Pabodie
2 lake Anderson Lake
3 roe Valentina Roerich
4 danforth Frank Danforth
name lat long
0 DR-1 -49.85 -128.57
1 DR-3 -47.15 -126.72
2 MSK-4 -48.87 -123.40
taken person quant reading
0 619 dyer rad 9.82
1 619 dyer sal 0.13
2 622 dyer rad 7.80
3 622 dyer sal 0.09
4 734 pb rad 8.41
ident site dated
0 619 DR-1 1927-02-08
1 622 DR-1 1927-02-10
2 734 DR-3 1939-01-07
3 735 DR-3 1930-01-12
4 751 DR-3 1930-02-26
In [13]:
redata = pd.concat([site,visited])
redata
Out[13]:
name | lat | long | ident | site | dated | |
---|---|---|---|---|---|---|
0 | DR-1 | -49.85 | -128.57 | NaN | NaN | NaN |
1 | DR-3 | -47.15 | -126.72 | NaN | NaN | NaN |
2 | MSK-4 | -48.87 | -123.40 | NaN | NaN | NaN |
0 | NaN | NaN | NaN | 619.0 | DR-1 | 1927-02-08 |
1 | NaN | NaN | NaN | 622.0 | DR-1 | 1927-02-10 |
2 | NaN | NaN | NaN | 734.0 | DR-3 | 1939-01-07 |
3 | NaN | NaN | NaN | 735.0 | DR-3 | 1930-01-12 |
4 | NaN | NaN | NaN | 751.0 | DR-3 | 1930-02-26 |
5 | NaN | NaN | NaN | 752.0 | DR-3 | NaN |
6 | NaN | NaN | NaN | 837.0 | MSK-4 | 1932-01-14 |
7 | NaN | NaN | NaN | 844.0 | DR-1 | 1932-03-22 |
In [15]:
redata = pd.concat([person,visited])
redata
Out[15]:
ident | personal | family | site | dated | |
---|---|---|---|---|---|
0 | dyer | William | Dyer | NaN | NaN |
1 | pb | Frank | Pabodie | NaN | NaN |
2 | lake | Anderson | Lake | NaN | NaN |
3 | roe | Valentina | Roerich | NaN | NaN |
4 | danforth | Frank | Danforth | NaN | NaN |
0 | 619 | NaN | NaN | DR-1 | 1927-02-08 |
1 | 622 | NaN | NaN | DR-1 | 1927-02-10 |
2 | 734 | NaN | NaN | DR-3 | 1939-01-07 |
3 | 735 | NaN | NaN | DR-3 | 1930-01-12 |
4 | 751 | NaN | NaN | DR-3 | 1930-02-26 |
5 | 752 | NaN | NaN | DR-3 | NaN |
6 | 837 | NaN | NaN | MSK-4 | 1932-01-14 |
7 | 844 | NaN | NaN | DR-1 | 1932-03-22 |
axis = 0 : 행방향 (열단위) axis = 1 : 열방향 (행단위)
In [16]:
redata = pd.concat([person,visited],axis = 1 )
redata
Out[16]:
ident | personal | family | ident | site | dated | |
---|---|---|---|---|---|---|
0 | dyer | William | Dyer | 619 | DR-1 | 1927-02-08 |
1 | pb | Frank | Pabodie | 622 | DR-1 | 1927-02-10 |
2 | lake | Anderson | Lake | 734 | DR-3 | 1939-01-07 |
3 | roe | Valentina | Roerich | 735 | DR-3 | 1930-01-12 |
4 | danforth | Frank | Danforth | 751 | DR-3 | 1930-02-26 |
5 | NaN | NaN | NaN | 752 | DR-3 | NaN |
6 | NaN | NaN | NaN | 837 | MSK-4 | 1932-01-14 |
7 | NaN | NaN | NaN | 844 | DR-1 | 1932-03-22 |
(3) 두 데이타 프레임을 열방향으로 합치기¶
In [18]:
import numpy as np
carddf = [
{"payment_method": "카드 결제", "installment": "일시불"},
{"payment_method": "카드 결제", "installment": "3개월"},
{"payment_method": "무통장 입금", "installment": np.nan},
{"payment_method": "카드 결제", "installment": "일시불"},
]
carddf = pd.DataFrame(carddf)
carddf
pd.concat([df02, carddf])
Out[18]:
Name | date | amount | product | result | payment_method | installment | |
---|---|---|---|---|---|---|---|
0 | Kim | 2017-02-04 | 100.0 | cereal | confirmed | NaN | NaN |
1 | Kang | 2017-02-12 | 200.0 | kiwi | canceled | NaN | NaN |
2 | Kang | 2017-02-15 | 650.0 | banana | confirmed | NaN | NaN |
3 | Park | 2017-02-28 | 420.0 | cereal | confirmed | NaN | NaN |
0 | NaN | NaN | NaN | NaN | NaN | 카드 결제 | 일시불 |
1 | NaN | NaN | NaN | NaN | NaN | 카드 결제 | 3개월 |
2 | NaN | NaN | NaN | NaN | NaN | 무통장 입금 | NaN |
3 | NaN | NaN | NaN | NaN | NaN | 카드 결제 | 일시불 |
2. merge()¶
- 두 데이타프레임에 동일한 컬럼명이면 하나의 컬럼명으로
- 다른 컬럼명이면 두 개의 컬럼명이 중복
In [20]:
# (1) 방식
merge_data = pd.merge(site,visited, left_on='name', right_on='site')
merge_data
Out[20]:
name | lat | long | ident | site | dated | |
---|---|---|---|---|---|---|
0 | DR-1 | -49.85 | -128.57 | 619 | DR-1 | 1927-02-08 |
1 | DR-1 | -49.85 | -128.57 | 622 | DR-1 | 1927-02-10 |
2 | DR-1 | -49.85 | -128.57 | 844 | DR-1 | 1932-03-22 |
3 | DR-3 | -47.15 | -126.72 | 734 | DR-3 | 1939-01-07 |
4 | DR-3 | -47.15 | -126.72 | 735 | DR-3 | 1930-01-12 |
5 | DR-3 | -47.15 | -126.72 | 751 | DR-3 | 1930-02-26 |
6 | DR-3 | -47.15 | -126.72 | 752 | DR-3 | NaN |
7 | MSK-4 | -48.87 | -123.40 | 837 | MSK-4 | 1932-01-14 |
In [21]:
# (2) 방식
merge_data = site.merge(visited, left_on='name', right_on='site')
merge_data
Out[21]:
name | lat | long | ident | site | dated | |
---|---|---|---|---|---|---|
0 | DR-1 | -49.85 | -128.57 | 619 | DR-1 | 1927-02-08 |
1 | DR-1 | -49.85 | -128.57 | 622 | DR-1 | 1927-02-10 |
2 | DR-1 | -49.85 | -128.57 | 844 | DR-1 | 1932-03-22 |
3 | DR-3 | -47.15 | -126.72 | 734 | DR-3 | 1939-01-07 |
4 | DR-3 | -47.15 | -126.72 | 735 | DR-3 | 1930-01-12 |
5 | DR-3 | -47.15 | -126.72 | 751 | DR-3 | 1930-02-26 |
6 | DR-3 | -47.15 | -126.72 | 752 | DR-3 | NaN |
7 | MSK-4 | -48.87 | -123.40 | 837 | MSK-4 | 1932-01-14 |
In [23]:
#person과 survey 머지하기
merge_data = person.merge(survey, left_on='ident', right_on='person')
merge_data
Out[23]:
ident | personal | family | taken | person | quant | reading | |
---|---|---|---|---|---|---|---|
0 | dyer | William | Dyer | 619 | dyer | rad | 9.82 |
1 | dyer | William | Dyer | 619 | dyer | sal | 0.13 |
2 | dyer | William | Dyer | 622 | dyer | rad | 7.80 |
3 | dyer | William | Dyer | 622 | dyer | sal | 0.09 |
4 | pb | Frank | Pabodie | 734 | pb | rad | 8.41 |
5 | pb | Frank | Pabodie | 734 | pb | temp | -21.50 |
6 | pb | Frank | Pabodie | 735 | pb | rad | 7.22 |
7 | pb | Frank | Pabodie | 751 | pb | rad | 4.35 |
8 | pb | Frank | Pabodie | 751 | pb | temp | -18.50 |
9 | lake | Anderson | Lake | 734 | lake | sal | 0.05 |
10 | lake | Anderson | Lake | 751 | lake | sal | 0.10 |
11 | lake | Anderson | Lake | 752 | lake | rad | 2.19 |
12 | lake | Anderson | Lake | 752 | lake | sal | 0.09 |
13 | lake | Anderson | Lake | 752 | lake | temp | -16.00 |
14 | lake | Anderson | Lake | 837 | lake | rad | 1.46 |
15 | lake | Anderson | Lake | 837 | lake | sal | 0.21 |
16 | roe | Valentina | Roerich | 752 | roe | sal | 41.60 |
17 | roe | Valentina | Roerich | 837 | roe | sal | 22.50 |
18 | roe | Valentina | Roerich | 844 | roe | rad | 11.25 |
In [24]:
#person과 visited 머지하기
merge_data = person.merge(survey, left_on='ident', right_on='person',how='outer')
merge_data
Out[24]:
ident | personal | family | taken | person | quant | reading | |
---|---|---|---|---|---|---|---|
0 | dyer | William | Dyer | 619.0 | dyer | rad | 9.82 |
1 | dyer | William | Dyer | 619.0 | dyer | sal | 0.13 |
2 | dyer | William | Dyer | 622.0 | dyer | rad | 7.80 |
3 | dyer | William | Dyer | 622.0 | dyer | sal | 0.09 |
4 | pb | Frank | Pabodie | 734.0 | pb | rad | 8.41 |
5 | pb | Frank | Pabodie | 734.0 | pb | temp | -21.50 |
6 | pb | Frank | Pabodie | 735.0 | pb | rad | 7.22 |
7 | pb | Frank | Pabodie | 751.0 | pb | rad | 4.35 |
8 | pb | Frank | Pabodie | 751.0 | pb | temp | -18.50 |
9 | lake | Anderson | Lake | 734.0 | lake | sal | 0.05 |
10 | lake | Anderson | Lake | 751.0 | lake | sal | 0.10 |
11 | lake | Anderson | Lake | 752.0 | lake | rad | 2.19 |
12 | lake | Anderson | Lake | 752.0 | lake | sal | 0.09 |
13 | lake | Anderson | Lake | 752.0 | lake | temp | -16.00 |
14 | lake | Anderson | Lake | 837.0 | lake | rad | 1.46 |
15 | lake | Anderson | Lake | 837.0 | lake | sal | 0.21 |
16 | roe | Valentina | Roerich | 752.0 | roe | sal | 41.60 |
17 | roe | Valentina | Roerich | 837.0 | roe | sal | 22.50 |
18 | roe | Valentina | Roerich | 844.0 | roe | rad | 11.25 |
19 | danforth | Frank | Danforth | NaN | NaN | NaN | NaN |
20 | NaN | NaN | NaN | 735.0 | NaN | sal | 0.06 |
21 | NaN | NaN | NaN | 735.0 | NaN | temp | -26.00 |
In [1]:
# 누락값 개념
from numpy import NaN, nan, NAN
print(NaN == False) # False
print(NaN == 0) # False
print(NaN == '') # False
print(NaN == NaN) # 비교값이 없기 떄문에 얘도 False
False
False
False
False
In [2]:
# 누락값 비교 방법 : pandas 메소드 이용
import pandas as pd
print(pd.isnull(NaN)) # False
print(pd.isnull(False)) #False
print(pd.isnull(0)) # False
print(pd.isnull(''))# False
True
False
False
False
In [4]:
""" 누락값이 생기는 이유
1- 데이타 자체적으로 존재
2- 데이타 연결하면서
3- 데이타 입력시
4- 데이타 추출하여 연산할 때
"""
import pandas as pd
survey = pd.read_csv('./data/survey_survey.csv')
# survey
visited = pd.read_csv('./data/survey_visited.csv')
# visited
print(survey)
print(visited)
taken person quant reading
0 619 dyer rad 9.82
1 619 dyer sal 0.13
2 622 dyer rad 7.80
3 622 dyer sal 0.09
4 734 pb rad 8.41
5 734 lake sal 0.05
6 734 pb temp -21.50
7 735 pb rad 7.22
8 735 NaN sal 0.06
9 735 NaN temp -26.00
10 751 pb rad 4.35
11 751 pb temp -18.50
12 751 lake sal 0.10
13 752 lake rad 2.19
14 752 lake sal 0.09
15 752 lake temp -16.00
16 752 roe sal 41.60
17 837 lake rad 1.46
18 837 lake sal 0.21
19 837 roe sal 22.50
20 844 roe rad 11.25
ident site dated
0 619 DR-1 1927-02-08
1 622 DR-1 1927-02-10
2 734 DR-3 1939-01-07
3 735 DR-3 1930-01-12
4 751 DR-3 1930-02-26
5 752 DR-3 NaN
6 837 MSK-4 1932-01-14
7 844 DR-1 1932-03-22
In [5]:
#survey와 visited
merge_data = survey.merge(visited, left_on='taken', right_on='ident',how='outer')
merge_data
Out[5]:
taken | person | quant | reading | ident | site | dated | |
---|---|---|---|---|---|---|---|
0 | 619 | dyer | rad | 9.82 | 619 | DR-1 | 1927-02-08 |
1 | 619 | dyer | sal | 0.13 | 619 | DR-1 | 1927-02-08 |
2 | 622 | dyer | rad | 7.80 | 622 | DR-1 | 1927-02-10 |
3 | 622 | dyer | sal | 0.09 | 622 | DR-1 | 1927-02-10 |
4 | 734 | pb | rad | 8.41 | 734 | DR-3 | 1939-01-07 |
5 | 734 | lake | sal | 0.05 | 734 | DR-3 | 1939-01-07 |
6 | 734 | pb | temp | -21.50 | 734 | DR-3 | 1939-01-07 |
7 | 735 | pb | rad | 7.22 | 735 | DR-3 | 1930-01-12 |
8 | 735 | NaN | sal | 0.06 | 735 | DR-3 | 1930-01-12 |
9 | 735 | NaN | temp | -26.00 | 735 | DR-3 | 1930-01-12 |
10 | 751 | pb | rad | 4.35 | 751 | DR-3 | 1930-02-26 |
11 | 751 | pb | temp | -18.50 | 751 | DR-3 | 1930-02-26 |
12 | 751 | lake | sal | 0.10 | 751 | DR-3 | 1930-02-26 |
13 | 752 | lake | rad | 2.19 | 752 | DR-3 | NaN |
14 | 752 | lake | sal | 0.09 | 752 | DR-3 | NaN |
15 | 752 | lake | temp | -16.00 | 752 | DR-3 | NaN |
16 | 752 | roe | sal | 41.60 | 752 | DR-3 | NaN |
17 | 837 | lake | rad | 1.46 | 837 | MSK-4 | 1932-01-14 |
18 | 837 | lake | sal | 0.21 | 837 | MSK-4 | 1932-01-14 |
19 | 837 | roe | sal | 22.50 | 837 | MSK-4 | 1932-01-14 |
20 | 844 | roe | rad | 11.25 | 844 | DR-1 | 1932-03-22 |
In [13]:
""" 누락값 확인 """
ebola = pd.read_csv('./data/ebola_timeseries.csv')
# 제일 먼저 데이타 확인
print(ebola.shape)
# 누락값이 아닌 값의 개수 확인
print(ebola.count()) # NaN 값은 카운트가 안되는 것 활용
print(ebola.head())
# 누락값의 수 구하기
print(ebola.shape[0] - ebola.count())
# 전체적인 누락값의 수를 얻으려면 - numpy 라이브러리의 count_nonzero() 이용
import numpy as np
print(np.count_nonzero(ebola.isnull()))
(122, 18)
Date 122
Day 122
Cases_Guinea 93
Cases_Liberia 83
Cases_SierraLeone 87
Cases_Nigeria 38
Cases_Senegal 25
Cases_UnitedStates 18
Cases_Spain 16
Cases_Mali 12
Deaths_Guinea 92
Deaths_Liberia 81
Deaths_SierraLeone 87
Deaths_Nigeria 38
Deaths_Senegal 22
Deaths_UnitedStates 18
Deaths_Spain 16
Deaths_Mali 12
dtype: int64
Date Day Cases_Guinea Cases_Liberia Cases_SierraLeone \
0 1/5/2015 289 2776.0 NaN 10030.0
1 1/4/2015 288 2775.0 NaN 9780.0
2 1/3/2015 287 2769.0 8166.0 9722.0
3 1/2/2015 286 NaN 8157.0 NaN
4 12/31/2014 284 2730.0 8115.0 9633.0
Cases_Nigeria Cases_Senegal Cases_UnitedStates Cases_Spain Cases_Mali \
0 NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN
Deaths_Guinea Deaths_Liberia Deaths_SierraLeone Deaths_Nigeria \
0 1786.0 NaN 2977.0 NaN
1 1781.0 NaN 2943.0 NaN
2 1767.0 3496.0 2915.0 NaN
3 NaN 3496.0 NaN NaN
4 1739.0 3471.0 2827.0 NaN
Deaths_Senegal Deaths_UnitedStates Deaths_Spain Deaths_Mali
0 NaN NaN NaN NaN
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN NaN NaN NaN
4 NaN NaN NaN NaN
Date 0
Day 0
Cases_Guinea 29
Cases_Liberia 39
Cases_SierraLeone 35
Cases_Nigeria 84
Cases_Senegal 97
Cases_UnitedStates 104
Cases_Spain 106
Cases_Mali 110
Deaths_Guinea 30
Deaths_Liberia 41
Deaths_SierraLeone 35
Deaths_Nigeria 84
Deaths_Senegal 100
Deaths_UnitedStates 104
Deaths_Spain 106
Deaths_Mali 110
dtype: int64
1214
In [14]:
""" (1) 누락값 삭제하기 """
ebola.dropna= ebola.dropna()
ebola.dropna
Out[14]:
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 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
19 | 11/18/2014 | 241 | 2047.0 | 7082.0 | 6190.0 | 20.0 | 1.0 | 4.0 | 1.0 | 6.0 | 1214.0 | 2963.0 | 1267.0 | 8.0 | 0.0 | 1.0 | 0.0 | 6.0 |
In [26]:
""" (2) 누락값 대치하기 """
ebola.fillna(0, inplace=True)
ebola['Cases_hap'] = ebola['Cases_SierraLeone'].sum() + ebola['Cases_Liberia'].sum()
ebola['Cases_hap'].sum()
ebola
Out[26]:
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 | Cases_hap | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1/5/2015 | 289 | 2776.0 | 0.0 | 10030.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1786.0 | 0.0 | 2977.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 405014.0 |
1 | 1/4/2015 | 288 | 2775.0 | 0.0 | 9780.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1781.0 | 0.0 | 2943.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 405014.0 |
2 | 1/3/2015 | 287 | 2769.0 | 8166.0 | 9722.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1767.0 | 3496.0 | 2915.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 405014.0 |
3 | 1/2/2015 | 286 | 0.0 | 8157.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 3496.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 405014.0 |
4 | 12/31/2014 | 284 | 2730.0 | 8115.0 | 9633.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1739.0 | 3471.0 | 2827.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 405014.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
117 | 3/27/2014 | 5 | 103.0 | 8.0 | 6.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 66.0 | 6.0 | 5.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 405014.0 |
118 | 3/26/2014 | 4 | 86.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 62.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 405014.0 |
119 | 3/25/2014 | 3 | 86.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 60.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 405014.0 |
120 | 3/24/2014 | 2 | 86.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 59.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 405014.0 |
121 | 3/22/2014 | 0 | 49.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 29.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 405014.0 |
122 rows × 19 columns
그럼 누락값 처리로 Data Cleaning 후 데이터 처리(Data Process)를 진행한다면?
datetime 라이브러리¶
- date
- time
- datetime
[ df ]
문자열 처리를 위해 str 접근자를 사용하듯이 datetime 오브젝트는 dt 접근자 사용해야 datetime 속성이나 메소드를 사용가능
In [6]:
""" datetime 라이브러리 : date / time / datetime 오브젝트 """
from datetime import datetime
#현재시간
print(datetime.now())
print(datetime.today())
#시간계산
t1 = datetime.now()
t2 = datetime(2021, 8, 10)
t1-t2
#년,월,일 추출
print(t1.year)
print(t1.month)
print(t1.day)
#datetime -> str
print(t1.strftime('%Y-%m-%d'))
print(t1.strftime('%Y-%m-%d %H:%M:%S'))
2021-08-30 14:42:31.707026
2021-08-30 14:42:31.707995
2021
8
30
2021-08-30
2021-08-30 14:42:31
[도서] Do it 데이타분석을 위한 판다스 입문
[ 연습 ] datatime 오브젝트로 변경하여 필요한 데이타 추출 및 계산¶
In [1]:
import pandas as pd
ebola = pd.read_csv('./data/ebola_timeseries.csv')
ebola.head()
Out[1]:
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 |
In [10]:
# datetime 오브젝트로 변경하여 필요한 데이타 추출 및 계산
ebola.info()
ebola['date_dt'] = pd.to_datetime(ebola['Date'])
ebola
ebola.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 122 entries, 0 to 121
Data columns (total 19 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Date 122 non-null object
1 Day 122 non-null int64
2 Cases_Guinea 93 non-null float64
3 Cases_Liberia 83 non-null float64
4 Cases_SierraLeone 87 non-null float64
5 Cases_Nigeria 38 non-null float64
6 Cases_Senegal 25 non-null float64
7 Cases_UnitedStates 18 non-null float64
8 Cases_Spain 16 non-null float64
9 Cases_Mali 12 non-null float64
10 Deaths_Guinea 92 non-null float64
11 Deaths_Liberia 81 non-null float64
12 Deaths_SierraLeone 87 non-null float64
13 Deaths_Nigeria 38 non-null float64
14 Deaths_Senegal 22 non-null float64
15 Deaths_UnitedStates 18 non-null float64
16 Deaths_Spain 16 non-null float64
17 Deaths_Mali 12 non-null float64
18 date_dt 122 non-null datetime64[ns]
dtypes: datetime64[ns](1), float64(16), int64(1), object(1)
memory usage: 18.2+ KB
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 122 entries, 0 to 121
Data columns (total 19 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Date 122 non-null object
1 Day 122 non-null int64
2 Cases_Guinea 93 non-null float64
3 Cases_Liberia 83 non-null float64
4 Cases_SierraLeone 87 non-null float64
5 Cases_Nigeria 38 non-null float64
6 Cases_Senegal 25 non-null float64
7 Cases_UnitedStates 18 non-null float64
8 Cases_Spain 16 non-null float64
9 Cases_Mali 12 non-null float64
10 Deaths_Guinea 92 non-null float64
11 Deaths_Liberia 81 non-null float64
12 Deaths_SierraLeone 87 non-null float64
13 Deaths_Nigeria 38 non-null float64
14 Deaths_Senegal 22 non-null float64
15 Deaths_UnitedStates 18 non-null float64
16 Deaths_Spain 16 non-null float64
17 Deaths_Mali 12 non-null float64
18 date_dt 122 non-null datetime64[ns]
dtypes: datetime64[ns](1), float64(16), int64(1), object(1)
memory usage: 18.2+ KB
In [11]:
#년도를 추출하려면
ebola['year']=ebola['date_dt'].dt.year
ebola
Out[11]:
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 | date_dt | year | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 | 2015-01-05 | 2015 |
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 | 2015-01-04 | 2015 |
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 | 2015-01-03 | 2015 |
3 | 1/2/2015 | 286 | NaN | 8157.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3496.0 | NaN | NaN | NaN | NaN | NaN | NaN | 2015-01-02 | 2015 |
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 | 2014-12-31 | 2014 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
117 | 3/27/2014 | 5 | 103.0 | 8.0 | 6.0 | NaN | NaN | NaN | NaN | NaN | 66.0 | 6.0 | 5.0 | NaN | NaN | NaN | NaN | NaN | 2014-03-27 | 2014 |
118 | 3/26/2014 | 4 | 86.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 62.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2014-03-26 | 2014 |
119 | 3/25/2014 | 3 | 86.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 60.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2014-03-25 | 2014 |
120 | 3/24/2014 | 2 | 86.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 59.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2014-03-24 | 2014 |
121 | 3/22/2014 | 0 | 49.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 29.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2014-03-22 | 2014 |
122 rows × 20 columns
[ 연습 ] 에볼라 최초 발병일 구하기¶
In [17]:
print(ebola['date_dt'].min() )
2014-03-22 00:00:00
미국 주와 주별 인구 데이타 예제¶
- 2010년도 인구 밀도 기준으로 미국 주와 지역 순위를 출력
- 데이타를 로딩 후 데이타 정보 확인
- 데이타 연결
1- 인구 데이타와 주이름 약어 데이타를 연결 ( 각 주의 전체 이름과 인구를 볼 수 있도록 ) 2- 각 주의 인구 데이타와 면적 데이타를 연결 ( 각 주의 면적당 인구를 계산하여 인구 밀도를 구하기 )
- 데이타 정제(데이타 전처리)
- 누락값 처리
- 삭제한다
- 대체한다
- 누락값 처리
- 2010년 인구밀도 계산하고 표현
인구밀도 = 인구 / 면적
[도서] 파이썬 데이타 사이언스 핸드북 - 위키북스/오렐리
1. 데이타를 로딩 후 데이타 정보 확인¶
In [32]:
# 1. 데이타를 로딩 후 데이타 정보 확인
import pandas as pd
pop = pd.read_csv('./data/state-population.csv') # 주별 인구
areas = pd.read_csv('./data/state-areas.csv') # 주의 면적
abbrevs = pd.read_csv('./data/state-abbrevs.csv') # 주이름 약자
# 데이타 살펴보기
print(pop.head())
print(areas.head())
print(abbrevs.head())
# 행수 확인
print(pop.count())
print(areas.count())
print(abbrevs.count())
state/region ages year population
0 AL under18 2012 1117489.0
1 AL total 2012 4817528.0
2 AL under18 2010 1130966.0
3 AL total 2010 4785570.0
4 AL under18 2011 1125763.0
state area (sq. mi)
0 Alabama 52423
1 Alaska 656425
2 Arizona 114006
3 Arkansas 53182
4 California 163707
state abbreviation
0 Alabama AL
1 Alaska AK
2 Arizona AZ
3 Arkansas AR
4 California CA
state/region 2544
ages 2544
year 2544
population 2524
dtype: int64
state 52
area (sq. mi) 52
dtype: int64
state 51
abbreviation 51
dtype: int64
2. 데이타 연결¶
1- 인구 데이타(pop)와 주이름 약어 데이타(abbrevs)를 연결
( 각 주의 전체 이름과 인구를 볼 수 있도록 )
2- 각 주의 인구 데이타(pop)와 면적 데이타(areas)를 연결
( 각 주의 면적당 인구를 계산하여 인구 밀도를 구하기 )
In [36]:
#(1)인구 데이타(pop)와 주이름 약어 데이타(abbrevs)를 연결
data1 = pop.merge(abbrevs, left_on='state/region', right_on='abbreviation',how='outer')
print(data1)
#(2)각 주의 인구 데이타(pop)와 면적 데이타(areas)를 연결
data2= data1.merge(areas, left_on='state', right_on='state',how='outer')
data2
state/region ages year population state abbreviation
0 AL under18 2012 1117489.0 Alabama AL
1 AL total 2012 4817528.0 Alabama AL
2 AL under18 2010 1130966.0 Alabama AL
3 AL total 2010 4785570.0 Alabama AL
4 AL under18 2011 1125763.0 Alabama AL
... ... ... ... ... ... ...
2539 USA total 2010 309326295.0 NaN NaN
2540 USA under18 2011 73902222.0 NaN NaN
2541 USA total 2011 311582564.0 NaN NaN
2542 USA under18 2012 73708179.0 NaN NaN
2543 USA total 2012 313873685.0 NaN NaN
[2544 rows x 6 columns]
Out[36]:
state/region | ages | year | population | state | abbreviation | area (sq. mi) | |
---|---|---|---|---|---|---|---|
0 | AL | under18 | 2012.0 | 1117489.0 | Alabama | AL | 52423.0 |
1 | AL | total | 2012.0 | 4817528.0 | Alabama | AL | 52423.0 |
2 | AL | under18 | 2010.0 | 1130966.0 | Alabama | AL | 52423.0 |
3 | AL | total | 2010.0 | 4785570.0 | Alabama | AL | 52423.0 |
4 | AL | under18 | 2011.0 | 1125763.0 | Alabama | AL | 52423.0 |
... | ... | ... | ... | ... | ... | ... | ... |
2540 | USA | under18 | 2011.0 | 73902222.0 | NaN | NaN | NaN |
2541 | USA | total | 2011.0 | 311582564.0 | NaN | NaN | NaN |
2542 | USA | under18 | 2012.0 | 73708179.0 | NaN | NaN | NaN |
2543 | USA | total | 2012.0 | 313873685.0 | NaN | NaN | NaN |
2544 | NaN | NaN | NaN | NaN | Puerto Rico | NaN | 3515.0 |
2545 rows × 7 columns
3. 데이타 정제 - 누락값 처리¶
(1) 삭제한다
(2) 대체한다
실제로 2000년 이전의 PR(푸에르토리토)의 인구 데이타가 없는 것이다.
여기서는 2010년 데이타를 구할 것이기에 삭제해도 되지만 대체하는 방식을 연습한다
또한 전체 미국을 뜻하는 USA에 state와 abbreviation이 없다.
In [39]:
import numpy as np
# (1) null 값 확인
print(pd.isnull(data2)) # True -> null값이 있음
# (2) 우선 state 컬럼의 null 처리 -> 대체한다
data2['state'] = data2['state'].fillna('none') #임의의 'none'으로 대체 fillna 사용
data2['state']
state/region ages year population state abbreviation \
0 False False False False False False
1 False False False False False False
2 False False False False False False
3 False False False False False False
4 False False False False False False
... ... ... ... ... ... ...
2540 False False False False False True
2541 False False False False False True
2542 False False False False False True
2543 False False False False False True
2544 True True True True False True
area (sq. mi)
0 False
1 False
2 False
3 False
4 False
... ...
2540 True
2541 True
2542 True
2543 True
2544 False
[2545 rows x 7 columns]
Out[39]:
0 Alabama
1 Alabama
2 Alabama
3 Alabama
4 Alabama
...
2540 none
2541 none
2542 none
2543 none
2544 Puerto Rico
Name: state, Length: 2545, dtype: object
In [51]:
# 각 주의 인구를 연결한 데이타셋에 주의 면적 데이타 셋을 연결하기
# 1- pop과 abbreviation의 연결한 데이타셋과 areas(면적) 데이타셋을 연결
data1 = pd.merge(pop, abbrevs, left_on = 'state/region' , right_on='abbreviation',how='outer')
data2 = pd.merge(data1, areas, left_on='state',right_on='state', how='outer')
data2
# 2-널 값 여부 확인
print(pd.isnull(data2))
# 3- 널값 확인 : 면적값이 널인 주를 찾으면
(pd.isnull(data2['area (sq. mi)']))
state/region ages year population state abbreviation \
0 False False False False False False
1 False False False False False False
2 False False False False False False
3 False False False False False False
4 False False False False False False
... ... ... ... ... ... ...
2540 False False False False True True
2541 False False False False True True
2542 False False False False True True
2543 False False False False True True
2544 True True True True False True
area (sq. mi)
0 False
1 False
2 False
3 False
4 False
... ...
2540 True
2541 True
2542 True
2543 True
2544 False
[2545 rows x 7 columns]
Out[51]:
0 False
1 False
2 False
3 False
4 False
...
2540 True
2541 True
2542 True
2543 True
2544 False
Name: area (sq. mi), Length: 2545, dtype: bool
In [52]:
# 4- 널값 처리 : 데이타 삭제하기
# 미국 전역에 대한 데이타는 인구 밀도와 관련이 없기에 삭제
print(data2.shape)
data2.dropna(inplace=True)
print(data2.shape)
(2545, 7)
(2448, 7)
In [57]:
# 5- [결과확인] 면적이 null 값이 있는지 없는지 확인
print(pd.isnull(data2['area (sq. mi)']))
data2.isnull().any()
0 False
1 False
2 False
3 False
4 False
...
2443 False
2444 False
2445 False
2446 False
2447 False
Name: area (sq. mi), Length: 2448, dtype: bool
Out[57]:
state/region False
ages False
year False
population False
state False
abbreviation False
area (sq. mi) False
dtype: bool
2010년 인구밀도 계산하고 표현¶
인구밀도 = 인구 / 면적
필요한 데이타는 2010년 전체 인구에 대한 데이타집합이다.
In [59]:
data2
Out[59]:
state/region | ages | year | population | state | abbreviation | area (sq. mi) | |
---|---|---|---|---|---|---|---|
0 | AL | under18 | 2012.0 | 1117489.0 | Alabama | AL | 52423.0 |
1 | AL | total | 2012.0 | 4817528.0 | Alabama | AL | 52423.0 |
2 | AL | under18 | 2010.0 | 1130966.0 | Alabama | AL | 52423.0 |
3 | AL | total | 2010.0 | 4785570.0 | Alabama | AL | 52423.0 |
4 | AL | under18 | 2011.0 | 1125763.0 | Alabama | AL | 52423.0 |
... | ... | ... | ... | ... | ... | ... | ... |
2443 | WY | under18 | 1993.0 | 137458.0 | Wyoming | WY | 97818.0 |
2444 | WY | total | 1991.0 | 459260.0 | Wyoming | WY | 97818.0 |
2445 | WY | under18 | 1991.0 | 136720.0 | Wyoming | WY | 97818.0 |
2446 | WY | under18 | 1990.0 | 136078.0 | Wyoming | WY | 97818.0 |
2447 | WY | total | 1990.0 | 453690.0 | Wyoming | WY | 97818.0 |
2448 rows × 7 columns
In [63]:
# 필요한 데이타집합 추출
data3 = data2[data2['year']==2010]
data3 = data3[data2['ages']=='total']
print(data3)
# 주(state)를 기준으로 데이타 인덱스를 정하고 인구밀도 계산
data3.set_index('state', inplace=True)
# print(data)
density = data3['population']/data3['area (sq. mi)']
density
density.sort_values(ascending=False, inplace=True)
print(density)
state/region ages year population state \
3 AL total 2010.0 4785570.0 Alabama
91 AK total 2010.0 713868.0 Alaska
101 AZ total 2010.0 6408790.0 Arizona
189 AR total 2010.0 2922280.0 Arkansas
197 CA total 2010.0 37333601.0 California
283 CO total 2010.0 5048196.0 Colorado
293 CT total 2010.0 3579210.0 Connecticut
379 DE total 2010.0 899711.0 Delaware
389 DC total 2010.0 605125.0 District of Columbia
475 FL total 2010.0 18846054.0 Florida
485 GA total 2010.0 9713248.0 Georgia
570 HI total 2010.0 1363731.0 Hawaii
581 ID total 2010.0 1570718.0 Idaho
666 IL total 2010.0 12839695.0 Illinois
677 IN total 2010.0 6489965.0 Indiana
762 IA total 2010.0 3050314.0 Iowa
773 KS total 2010.0 2858910.0 Kansas
858 KY total 2010.0 4347698.0 Kentucky
869 LA total 2010.0 4545392.0 Louisiana
954 ME total 2010.0 1327366.0 Maine
965 MD total 2010.0 5787193.0 Maryland
1050 MA total 2010.0 6563263.0 Massachusetts
1061 MI total 2010.0 9876149.0 Michigan
1146 MN total 2010.0 5310337.0 Minnesota
1157 MS total 2010.0 2970047.0 Mississippi
1242 MO total 2010.0 5996063.0 Missouri
1253 MT total 2010.0 990527.0 Montana
1338 NE total 2010.0 1829838.0 Nebraska
1349 NV total 2010.0 2703230.0 Nevada
1434 NH total 2010.0 1316614.0 New Hampshire
1445 NJ total 2010.0 8802707.0 New Jersey
1530 NM total 2010.0 2064982.0 New Mexico
1541 NY total 2010.0 19398228.0 New York
1626 NC total 2010.0 9559533.0 North Carolina
1637 ND total 2010.0 674344.0 North Dakota
1722 OH total 2010.0 11545435.0 Ohio
1733 OK total 2010.0 3759263.0 Oklahoma
1818 OR total 2010.0 3837208.0 Oregon
1829 PA total 2010.0 12710472.0 Pennsylvania
1914 RI total 2010.0 1052669.0 Rhode Island
1925 SC total 2010.0 4636361.0 South Carolina
2010 SD total 2010.0 816211.0 South Dakota
2021 TN total 2010.0 6356683.0 Tennessee
2106 TX total 2010.0 25245178.0 Texas
2117 UT total 2010.0 2774424.0 Utah
2202 VT total 2010.0 625793.0 Vermont
2213 VA total 2010.0 8024417.0 Virginia
2298 WA total 2010.0 6742256.0 Washington
2309 WV total 2010.0 1854146.0 West Virginia
2394 WI total 2010.0 5689060.0 Wisconsin
2405 WY total 2010.0 564222.0 Wyoming
abbreviation area (sq. mi)
3 AL 52423.0
91 AK 656425.0
101 AZ 114006.0
189 AR 53182.0
197 CA 163707.0
283 CO 104100.0
293 CT 5544.0
379 DE 1954.0
389 DC 68.0
475 FL 65758.0
485 GA 59441.0
570 HI 10932.0
581 ID 83574.0
666 IL 57918.0
677 IN 36420.0
762 IA 56276.0
773 KS 82282.0
858 KY 40411.0
869 LA 51843.0
954 ME 35387.0
965 MD 12407.0
1050 MA 10555.0
1061 MI 96810.0
1146 MN 86943.0
1157 MS 48434.0
1242 MO 69709.0
1253 MT 147046.0
1338 NE 77358.0
1349 NV 110567.0
1434 NH 9351.0
1445 NJ 8722.0
1530 NM 121593.0
1541 NY 54475.0
1626 NC 53821.0
1637 ND 70704.0
1722 OH 44828.0
1733 OK 69903.0
1818 OR 98386.0
1829 PA 46058.0
1914 RI 1545.0
1925 SC 32007.0
2010 SD 77121.0
2021 TN 42146.0
2106 TX 268601.0
2117 UT 84904.0
2202 VT 9615.0
2213 VA 42769.0
2298 WA 71303.0
2309 WV 24231.0
2394 WI 65503.0
2405 WY 97818.0
state
District of Columbia 8898.897059
New Jersey 1009.253268
Rhode Island 681.339159
Connecticut 645.600649
Massachusetts 621.815538
Maryland 466.445797
Delaware 460.445752
New York 356.094135
Florida 286.597129
Pennsylvania 275.966651
Ohio 257.549634
California 228.051342
Illinois 221.687472
Virginia 187.622273
Indiana 178.197831
North Carolina 177.617157
Georgia 163.409902
Tennessee 150.825298
South Carolina 144.854594
New Hampshire 140.799273
Hawaii 124.746707
Kentucky 107.586994
Michigan 102.015794
Washington 94.557817
Texas 93.987655
Alabama 91.287603
Louisiana 87.676099
Wisconsin 86.851900
Missouri 86.015622
West Virginia 76.519582
Vermont 65.085075
Mississippi 61.321530
Minnesota 61.078373
Arizona 56.214497
Arkansas 54.948667
Iowa 54.202751
Oklahoma 53.778278
Colorado 48.493718
Oregon 39.001565
Maine 37.509990
Kansas 34.745266
Utah 32.677188
Nevada 24.448796
Nebraska 23.654153
Idaho 18.794338
New Mexico 16.982737
South Dakota 10.583512
North Dakota 9.537565
Montana 6.736171
Wyoming 5.768079
Alaska 1.087509
dtype: float64
<ipython-input-63-478ca3b1d239>:3: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
data3 = data3[data2['ages']=='total']
[결과]¶
state
District of Columbia 8898.897059
New Jersey 1009.253268
Rhode Island 681.339159
Connecticut 645.600649
Massachusetts 621.815538
Maryland 466.445797
Delaware 460.445752
New York 356.094135
Florida 286.597129
Pennsylvania 275.966651
Ohio 257.549634
California 228.051342
Illinois 221.687472
Virginia 187.622273
Indiana 178.197831
North Carolina 177.617157
Georgia 163.409902
Tennessee 150.825298
South Carolina 144.854594
New Hampshire 140.799273
Hawaii 124.746707
Kentucky 107.586994
Michigan 102.015794
Washington 94.557817
Texas 93.987655
Alabama 91.287603
Louisiana 87.676099
Wisconsin 86.851900
Missouri 86.015622
West Virginia 76.519582
Vermont 65.085075
Mississippi 61.321530
Minnesota 61.078373
Arizona 56.214497
Arkansas 54.948667
Iowa 54.202751
Oklahoma 53.778278
Colorado 48.493718
Oregon 39.001565
Maine 37.509990
Kansas 34.745266
Utah 32.677188
Nevada 24.448796
Nebraska 23.654153
Idaho 18.794338
New Mexico 16.982737
South Dakota 10.583512
North Dakota 9.537565
Montana 6.736171
Wyoming 5.768079
Alaska 1.087509
[분석결과]
인구 밀도가 가장 높은 주는 District of Columbia(DC) 워싱톤DC 이고 그 다음은 Puerto Rico 이다.
인구 밀도가 가장 작은 Alaska는 1제곱마일당 평균 주민수가 1만명정도이다.
[시각화작업]
In [69]:
density.plot(kind='pie');
파산한 은행 데이타집합에서 분기별 은행수를 계산하기¶
1. 먼저 데이타 구조를 파악하기
2. 'Closing Date' 날짜 항목을 datetime 오브젝트로 변기하기
3. 'Closing Date' 날짜 정보에서 dt 접근자를 이용하여 연도(year)와 분기(quarter)를 구하기
4. 연도별 파산은행 수 구하기
5. 연도별, 분기별 파산은행 수 구하기
6. 정보 시각화
[도서] Do it 데이타분석을 위한 판다스 입문
In [4]:
import pandas as pd
banks = pd.read_csv('./data/banklist.csv')
banks.head()
Out[4]:
Bank Name | City | ST | CERT | Acquiring Institution | Closing Date | Updated Date | |
---|---|---|---|---|---|---|---|
0 | Washington Federal Bank for Savings | Chicago | IL | 30570 | Royal Savings Bank | 15-Dec-17 | 20-Dec-17 |
1 | The Farmers and Merchants State Bank of Argonia | Argonia | KS | 17719 | Conway Bank | 13-Oct-17 | 20-Oct-17 |
2 | Fayette County Bank | Saint Elmo | IL | 1802 | United Fidelity Bank, fsb | 26-May-17 | 26-Jul-17 |
3 | Guaranty Bank, (d/b/a BestBank in Georgia & Mi... | Milwaukee | WI | 30003 | First-Citizens Bank & Trust Company | 5-May-17 | 26-Jul-17 |
4 | First NBC Bank | New Orleans | LA | 58302 | Whitney Bank | 28-Apr-17 | 5-Dec-17 |
(1) 먼저 데이타 구조를 파악하기¶
In [5]:
banks.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 555 entries, 0 to 554
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Bank Name 555 non-null object
1 City 555 non-null object
2 ST 555 non-null object
3 CERT 555 non-null int64
4 Acquiring Institution 555 non-null object
5 Closing Date 555 non-null object
6 Updated Date 555 non-null object
dtypes: int64(1), object(6)
memory usage: 30.5+ KB
(2) Closing Date를 datetime 오브젝트로 변경¶
In [8]:
from datetime import datetime
import pandas as pd
banks['Closing Date'] = pd.to_datetime(banks['Closing Date'])
banks.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 555 entries, 0 to 554
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Bank Name 555 non-null object
1 City 555 non-null object
2 ST 555 non-null object
3 CERT 555 non-null int64
4 Acquiring Institution 555 non-null object
5 Closing Date 555 non-null datetime64[ns]
6 Updated Date 555 non-null object
dtypes: datetime64[ns](1), int64(1), object(5)
memory usage: 30.5+ KB
(3) 날짜 정보에서 dt 접근자를 이용하여 연도(year)와 분기(quarter)를 구한다¶
In [12]:
banks['year']=banks['Closing Date'].dt.year
banks['quarter']=banks['Closing Date'].dt.quarter
banks.head()
Out[12]:
Bank Name | City | ST | CERT | Acquiring Institution | Closing Date | Updated Date | year | quarter | |
---|---|---|---|---|---|---|---|---|---|
0 | Washington Federal Bank for Savings | Chicago | IL | 30570 | Royal Savings Bank | 2017-12-15 | 20-Dec-17 | 2017 | 4 |
1 | The Farmers and Merchants State Bank of Argonia | Argonia | KS | 17719 | Conway Bank | 2017-10-13 | 20-Oct-17 | 2017 | 4 |
2 | Fayette County Bank | Saint Elmo | IL | 1802 | United Fidelity Bank, fsb | 2017-05-26 | 26-Jul-17 | 2017 | 2 |
3 | Guaranty Bank, (d/b/a BestBank in Georgia & Mi... | Milwaukee | WI | 30003 | First-Citizens Bank & Trust Company | 2017-05-05 | 26-Jul-17 | 2017 | 2 |
4 | First NBC Bank | New Orleans | LA | 58302 | Whitney Bank | 2017-04-28 | 5-Dec-17 | 2017 | 2 |
(4) 연도별 파산은행 수 구하기¶
In [21]:
banks.groupby('year').count()[['Closing Date']]
Out[21]:
Closing Date | |
---|---|
year | |
2000 | 2 |
2001 | 4 |
2002 | 11 |
2003 | 3 |
2004 | 4 |
2007 | 3 |
2008 | 25 |
2009 | 140 |
2010 | 157 |
2011 | 92 |
2012 | 51 |
2013 | 24 |
2014 | 18 |
2015 | 8 |
2016 | 5 |
2017 | 8 |
(5) 연도별, 분기별 파산은행 수 구하기¶
In [23]:
banks.groupby('quarter').count()[['Closing Date']]
Out[23]:
Closing Date | |
---|---|
quarter | |
1 | 135 |
2 | 138 |
3 | 153 |
4 | 129 |
(6) 결과를 시각화 ( 간단하게 )¶
In [34]:
year_closing_data = banks.groupby('year').count()[['Closing Date']]
quarter_closing_data = banks.groupby('quarter').count()[['Closing Date']]
year_closing_data.plot(kind='barh');
quarter_closing_data.plot(kind='barh');
'Programing Language > Python' 카테고리의 다른 글
0831 머신러닝(machine learning) (0) | 2021.08.31 |
---|---|
0827 matplotlib 시각화 (0) | 2021.08.29 |
0826 Pandas, 미국 대통령 데이터, 판다스 계산, 시각화 (0) | 2021.08.26 |
0825 Python , jupyterNoteBook (0) | 2021.08.25 |
python Day 3 (0) | 2021.08.05 |
댓글