In [1]:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import csv
In [5]:
data_unit2 = pd.read_csv('seoul.csv', encoding = 'cp949')
data_unit2
Out[5]:
날짜 | 지점 | 평균기온(℃) | 최저기온(℃) | 최고기온(℃) | |
---|---|---|---|---|---|
0 | 1907-10-01 | 108 | 13.5 | 7.9 | 20.7 |
1 | 1907-10-02 | 108 | 16.2 | 7.9 | 22.0 |
2 | 1907-10-03 | 108 | 16.2 | 13.1 | 21.3 |
3 | 1907-10-04 | 108 | 16.5 | 11.2 | 22.0 |
4 | 1907-10-05 | 108 | 17.6 | 10.9 | 25.4 |
... | ... | ... | ... | ... | ... |
40216 | 2019-01-13 | 108 | 1.2 | -3.0 | 7.6 |
40217 | 2019-01-14 | 108 | 1.4 | -2.4 | 5.3 |
40218 | 2019-01-15 | 108 | -1.7 | -7.2 | 2.6 |
40219 | 2019-01-16 | 108 | -5.2 | -10.1 | -1.1 |
40220 | 2019-01-17 | 108 | -0.3 | -3.2 | 4.0 |
40221 rows × 5 columns
In [6]:
data_unit2.isnull().values.any()
Out[6]:
True
In [7]:
print(data_unit2.isnull())
print('')
print(type(data_unit2.isnull()))
날짜 지점 평균기온(℃) 최저기온(℃) 최고기온(℃) 0 False False False False False 1 False False False False False 2 False False False False False 3 False False False False False 4 False False False False False ... ... ... ... ... ... 40216 False False False False False 40217 False False False False False 40218 False False False False False 40219 False False False False False 40220 False False False False False [40221 rows x 5 columns] <class 'pandas.core.frame.DataFrame'>
In [8]:
print(data_unit2.isnull().any())
print('')
print(data_unit2.isnull().values.any())
날짜 False 지점 False 평균기온(℃) True 최저기온(℃) True 최고기온(℃) True dtype: bool True
In [9]:
print(data_unit2['최고기온(℃)'].isnull())
print('')
print(type(data_unit2['최고기온(℃)'].isnull()))
0 False 1 False 2 False 3 False 4 False ... 40216 False 40217 False 40218 False 40219 False 40220 False Name: 최고기온(℃), Length: 40221, dtype: bool <class 'pandas.core.series.Series'>
In [10]:
data_unit2[data_unit2['최고기온(℃)'].isnull()]
Out[10]:
날짜 | 지점 | 평균기온(℃) | 최저기온(℃) | 최고기온(℃) | |
---|---|---|---|---|---|
15676 | 1950-09-01 | 108 | NaN | NaN | NaN |
15677 | 1950-09-02 | 108 | NaN | NaN | NaN |
15678 | 1950-09-03 | 108 | NaN | NaN | NaN |
15679 | 1950-09-04 | 108 | NaN | NaN | NaN |
15680 | 1950-09-05 | 108 | NaN | NaN | NaN |
... | ... | ... | ... | ... | ... |
16429 | 1953-11-28 | 108 | NaN | NaN | NaN |
16430 | 1953-11-29 | 108 | NaN | NaN | NaN |
16431 | 1953-11-30 | 108 | NaN | NaN | NaN |
21260 | 1967-02-19 | 108 | -1.7 | NaN | NaN |
39758 | 2017-10-12 | 108 | 11.4 | 8.8 | NaN |
758 rows × 5 columns
In [11]:
data_unit2.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 40221 entries, 0 to 40220 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 날짜 40221 non-null object 1 지점 40221 non-null int64 2 평균기온(℃) 39465 non-null float64 3 최저기온(℃) 39464 non-null float64 4 최고기온(℃) 39463 non-null float64 dtypes: float64(3), int64(1), object(1) memory usage: 1.5+ MB
In [12]:
print(data_unit2.max(axis=0))
print('')
print(data_unit2.max(axis=1))
print('')
print(data_unit2['최고기온(℃)'].max())
날짜 2019-01-17 지점 108 평균기온(℃) 33.7 최저기온(℃) 30.3 최고기온(℃) 39.6 dtype: object 0 108.0 1 108.0 2 108.0 3 108.0 4 108.0 ... 40216 108.0 40217 108.0 40218 108.0 40219 108.0 40220 108.0 Length: 40221, dtype: float64 39.6
C:\Users\82105\AppData\Local\Temp\ipykernel_1456\4264692106.py:3: FutureWarning: Dropping of nuisance columns in DataFrame reductions (with 'numeric_only=None') is deprecated; in a future version this will raise TypeError. Select only valid columns before calling the reduction. print(data_unit2.max(axis=1))
In [ ]:
셋째마당 인구 공공데이터
Unit 7. 우리 동네 인구 구조 시각화하기
데이터를 불러 옵니다.
1000단위 콤마를 처리해주기 위해 pd.read_csv 함수에 thousands 인자를 추가해 주었습니다
In [13]:
age_data = pd.read_csv('age.csv', encoding = 'cp949', thousands = ',')
age_data.head()
Out[13]:
행정구역 | 2019년02월_계_총인구수 | 2019년02월_계_연령구간인구수 | 2019년02월_계_0세 | 2019년02월_계_1세 | 2019년02월_계_2세 | 2019년02월_계_3세 | 2019년02월_계_4세 | 2019년02월_계_5세 | 2019년02월_계_6세 | ... | 2019년02월_계_91세 | 2019년02월_계_92세 | 2019년02월_계_93세 | 2019년02월_계_94세 | 2019년02월_계_95세 | 2019년02월_계_96세 | 2019년02월_계_97세 | 2019년02월_계_98세 | 2019년02월_계_99세 | 2019년02월_계_100세 이상 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 서울특별시 (1100000000) | 9770638 | 9770638 | 53738 | 59599 | 65815 | 70726 | 70037 | 69000 | 76377 | ... | 7199 | 5374 | 3972 | 2927 | 2813 | 2260 | 1565 | 1180 | 880 | 5932 |
1 | 서울특별시 종로구 (1111000000) | 152880 | 152880 | 593 | 683 | 775 | 874 | 852 | 863 | 1023 | ... | 163 | 132 | 112 | 79 | 69 | 81 | 53 | 40 | 39 | 236 |
2 | 서울특별시 종로구 청운효자동(1111051500) | 13010 | 13010 | 66 | 79 | 72 | 98 | 98 | 94 | 108 | ... | 9 | 8 | 14 | 6 | 7 | 9 | 4 | 2 | 2 | 16 |
3 | 서울특별시 종로구 사직동(1111053000) | 9584 | 9584 | 43 | 50 | 64 | 67 | 67 | 70 | 94 | ... | 14 | 5 | 12 | 6 | 5 | 8 | 2 | 5 | 4 | 17 |
4 | 서울특별시 종로구 삼청동(1111054000) | 2820 | 2820 | 9 | 15 | 3 | 21 | 11 | 13 | 9 | ... | 6 | 6 | 1 | 3 | 0 | 3 | 1 | 0 | 2 | 7 |
5 rows × 104 columns
In [ ]:
불러온 데이터프레임의 정보를 info() 함수로 확인해보겠습니다.
오브젝트 1개를 제외하면 나머지 데이터는 전부 숫자(int64)로 이루어졌다는 것을 기억해주세요.
직관적으로 아시겠지만 오브젝트 타입의 데이터는 '행정구역' 열임니다.
In [15]:
age_data.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 3841 entries, 0 to 3840 Columns: 104 entries, 행정구역 to 2019년02월_계_100세 이상 dtypes: int64(103), object(1) memory usage: 3.0+ MB
In [ ]:
특정 문자열을 검색하기 위해선 판다스 시리즈 데이터에 내장된 str.contains 함수를 사용할 수 있습니다.
시리즈를 불러오기 위해선 ['컬럼명'] 데이터프레임을 불러오기 위해선 [['컬럼명']]을 사용하면 됩니다.
우선 시리즈 데이터로 불러와 보겠습니다.
In [16]:
print(type(age_data['행정구역']))
print('')
age_data['행정구역']
<class 'pandas.core.series.Series'>
Out[16]:
0 서울특별시 (1100000000) 1 서울특별시 종로구 (1111000000) 2 서울특별시 종로구 청운효자동(1111051500) 3 서울특별시 종로구 사직동(1111053000) 4 서울특별시 종로구 삼청동(1111054000) ... 3836 제주특별자치도 서귀포시 서홍동(5013058000) 3837 제주특별자치도 서귀포시 대륜동(5013059000) 3838 제주특별자치도 서귀포시 대천동(5013060000) 3839 제주특별자치도 서귀포시 중문동(5013061000) 3840 제주특별자치도 서귀포시 예래동(5013062000) Name: 행정구역, Length: 3841, dtype: object
In [ ]:
데이터 프레임으로 불러와 보겠습니다
In [17]:
print(type(age_data[['행정구역']]))
print('')
age_data[['행정구역']]
<class 'pandas.core.frame.DataFrame'>
Out[17]:
행정구역 | |
---|---|
0 | 서울특별시 (1100000000) |
1 | 서울특별시 종로구 (1111000000) |
2 | 서울특별시 종로구 청운효자동(1111051500) |
3 | 서울특별시 종로구 사직동(1111053000) |
4 | 서울특별시 종로구 삼청동(1111054000) |
... | ... |
3836 | 제주특별자치도 서귀포시 서홍동(5013058000) |
3837 | 제주특별자치도 서귀포시 대륜동(5013059000) |
3838 | 제주특별자치도 서귀포시 대천동(5013060000) |
3839 | 제주특별자치도 서귀포시 중문동(5013061000) |
3840 | 제주특별자치도 서귀포시 예래동(5013062000) |
3841 rows × 1 columns
In [ ]:
판다스 시리즈 데이터를 불러오고 앞서 언급했던 내장함수를 통해 검색해보겠습니다.
아래 코드와 같이 조건에 따라 index를 True / False 형태로 반환하고,
In [18]:
age_data['행정구역'].str.contains('계룡시')
Out[18]:
0 False 1 False 2 False 3 False 4 False ... 3836 False 3837 False 3838 False 3839 False 3840 False Name: 행정구역, Length: 3841, dtype: bool
In [ ]:
True인 인덱스만 출력하면 다음과 같습니다.
이후 코드가 너무 길어지기 때문에 해당 데이터는 city_data라는 변수에 저장해두겠습니다.
In [19]:
city_data = age_data[age_data['행정구역'].str.contains('계룡시')]
city_data
Out[19]:
행정구역 | 2019년02월_계_총인구수 | 2019년02월_계_연령구간인구수 | 2019년02월_계_0세 | 2019년02월_계_1세 | 2019년02월_계_2세 | 2019년02월_계_3세 | 2019년02월_계_4세 | 2019년02월_계_5세 | 2019년02월_계_6세 | ... | 2019년02월_계_91세 | 2019년02월_계_92세 | 2019년02월_계_93세 | 2019년02월_계_94세 | 2019년02월_계_95세 | 2019년02월_계_96세 | 2019년02월_계_97세 | 2019년02월_계_98세 | 2019년02월_계_99세 | 2019년02월_계_100세 이상 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2374 | 충청남도 계룡시 (4425000000) | 43484 | 43484 | 275 | 301 | 384 | 432 | 423 | 464 | 509 | ... | 40 | 21 | 20 | 9 | 9 | 13 | 7 | 4 | 4 | 9 |
2375 | 충청남도 계룡시 두마면(4425031000) | 6959 | 6959 | 45 | 32 | 59 | 62 | 67 | 72 | 90 | ... | 5 | 5 | 9 | 3 | 2 | 1 | 3 | 0 | 3 | 2 |
2376 | 충청남도 계룡시 엄사면(4425031500) | 19015 | 19015 | 107 | 123 | 144 | 144 | 141 | 137 | 149 | ... | 25 | 16 | 6 | 4 | 6 | 9 | 3 | 3 | 1 | 5 |
2377 | 충청남도 계룡시 신도안면(4425033000) | 8819 | 8819 | 77 | 92 | 117 | 130 | 143 | 154 | 150 | ... | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
2378 | 충청남도 계룡시 금암동(4425051000) | 8691 | 8691 | 46 | 54 | 64 | 96 | 72 | 101 | 120 | ... | 9 | 0 | 5 | 1 | 1 | 3 | 1 | 1 | 0 | 2 |
5 rows × 104 columns
In [ ]:
이번엔 위에서 조건문을 통해 뽑아낸 데이터를 그래프로 그려보겠습니다.
아쉽게도 아래 코드를 그대로 시행 시키면 오류가 발생합니다.
해당 오류는 문자열(오브젝트)때문에 발생한 오류로 문자열인 '행정구역' 열을 인덱스로 빼거나 혹은 이것을 제외하고 불러와야합니다
In [ ]:
# plt.style.use('ggplot')
# plt.plot(city_data)
# plt.show()
In [ ]:
에서 소개했던 방식처럼 '행정구역' 열을 인덱스로 빼주도록 하겠습니다
In [20]:
city_data = city_data.set_index('행정구역')
city_data
Out[20]:
2019년02월_계_총인구수 | 2019년02월_계_연령구간인구수 | 2019년02월_계_0세 | 2019년02월_계_1세 | 2019년02월_계_2세 | 2019년02월_계_3세 | 2019년02월_계_4세 | 2019년02월_계_5세 | 2019년02월_계_6세 | 2019년02월_계_7세 | ... | 2019년02월_계_91세 | 2019년02월_계_92세 | 2019년02월_계_93세 | 2019년02월_계_94세 | 2019년02월_계_95세 | 2019년02월_계_96세 | 2019년02월_계_97세 | 2019년02월_계_98세 | 2019년02월_계_99세 | 2019년02월_계_100세 이상 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
행정구역 | |||||||||||||||||||||
충청남도 계룡시 (4425000000) | 43484 | 43484 | 275 | 301 | 384 | 432 | 423 | 464 | 509 | 545 | ... | 40 | 21 | 20 | 9 | 9 | 13 | 7 | 4 | 4 | 9 |
충청남도 계룡시 두마면(4425031000) | 6959 | 6959 | 45 | 32 | 59 | 62 | 67 | 72 | 90 | 94 | ... | 5 | 5 | 9 | 3 | 2 | 1 | 3 | 0 | 3 | 2 |
충청남도 계룡시 엄사면(4425031500) | 19015 | 19015 | 107 | 123 | 144 | 144 | 141 | 137 | 149 | 176 | ... | 25 | 16 | 6 | 4 | 6 | 9 | 3 | 3 | 1 | 5 |
충청남도 계룡시 신도안면(4425033000) | 8819 | 8819 | 77 | 92 | 117 | 130 | 143 | 154 | 150 | 170 | ... | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
충청남도 계룡시 금암동(4425051000) | 8691 | 8691 | 46 | 54 | 64 | 96 | 72 | 101 | 120 | 105 | ... | 9 | 0 | 5 | 1 | 1 | 3 | 1 | 1 | 0 | 2 |
5 rows × 103 columns
In [ ]:
'행정구역' 이외에도 불필요한 자료가 많습니다.
총 인구수 항목들을 제외하고 불러오도록 합니다.
columns.difference 함수는 선택된 열이 아닌 열만을 선택합니다.
이 과정에서 재정렬되지 않도록 sort 항목을 False로 두겠습니다.
참고로 이 항목의 default값은 True가 아닌 None으로 True를 입력하면 오류가 발생하게 됩니다.
In [3]:
city_data[city_data.columns.difference([' 2019년02월_계_총인구수', '2019년02월_계_연령구간인구수',' 2019년02월_계_총인구수'])
Input In [3] city_data[city_data.columns.difference([' 2019년02월_계_총인구수', '2019년02월_계_연령구간인구수',' 2019년02월_계_총인구수']) ^ SyntaxError: unexpected EOF while parsing
In [ ]:
'파이썬 활용 > 문자열' 카테고리의 다른 글
문자열 함수 모음집 (0) | 2022.10.25 |
---|---|
지하철 사용 빈도 알아보기 2 시계열 문자열 활용 (0) | 2022.10.25 |
text파일을 통한 자연어 처리 빈도 분석(Okt, wordcloud) (0) | 2022.10.25 |
월드컵 명단을 통한 문자열 함수 이용 (0) | 2022.10.25 |
문자열 이용해서 간단한 프로그램 만들기(주민번호) (0) | 2022.10.24 |