1. 넘파이를 쓰는 이유

: 수치를 다루는데 특화됨, 넘파이가 제공하는 기능을 사용하기 위해 

 

* object란? 

- object = data + methods
- 파이썬에서는 모든 것이 object(객체)다. 
- 변수선언하는 것도 다 object 
- object를 만드는 과정 -> instantiation 

 

 

2. 간단한 기능 


- dir() -> 기능 확인 
- type() -> 타입 확인 

 

 

3. ndarray

- np.array()

- np.zeros(shape=(a,b)) -> 0으로 채운 (a,b) 

- np.ones(shape=(a,b)) -> 1로 채운 (a,b)

- np.full(shape=(a,b), fill_value=x) -> x값으로 (a,b)형태로 만듦.

- np.empty(shape=(a,b)) -> 공간 만든다고 생각 ( 쓰레기 값 들어감), 나중에 값 채울 때 주로 사용 

 

- np.zeros_like(M) -> M과 shape 같음, 0으로 채움 

- np.ones_lke(M) -> M과 shape 같음, 1로 채움 
- np.full_like(M, fill_value=x) -> M과 shape 같음, x로 값채움 
- np.empty_like(M) -> M과 shape같음, 쓰레기값 들어감 

 

* 파이썬에서 range() 는 소수점을 사용하면 에러가 나지만 넘파이에서는 arange 쓸 때 소수점 가능함 

4. linspace와 arange 차이점  

: 같은 결과를 만들 수 있음 

print(np.arange(0, 1+0.25, 0.25))
print(np.linspace(0, 1, 5))

결과는 [0. 0.25 0.5 0.75 1. ] 으로 동일함 


- np.linspace(start, stop, num=50 ...) 

: 처음값과 끝값을 포함

: 몇 개로 만들지, -> 개수 강조할 때 사용하면 코드 가독성 †

 

- np.arange([start], stop, [step] ...), [] 생략가능

: 끝값 포함하지 않음 
: 범위, step -> 구간, 간격 강조할 때 사용하면 코드 가독성 †

 

 

5. Normal Distributions

- random.randn(d0,  d1, ..., dn) -> 차원값

: 표준정규분포: 평균이 0이고 표준편차가 1인 것 
: 균등하게 샘플링 함 

 

-random.normal(loc=0.0,  scale=1.0, size=None) 
: loc=평균, scale=표준편차

 

-random.uniform(low=0.0,  high=1.0, size=None)
: 범위 지정가능 

 

-random.randint(low, high=None, size=None, dtype=int) 
: high 숫자 포함하지 않음 
: int형태로 출력됨

 

 

'Python > Numpy' 카테고리의 다른 글

np.reshape, np.resize 차이점2, flatten, ravel, copy, view  (0) 2021.03.30
np.reshape, np.resize 차이점  (0) 2021.03.30
ndim, shape, size  (0) 2021.03.29

pinkwink.kr/983?category=522424

 

[Seaborn 연재] set_style과 boxplot, swarmplot

통계적 입장에서 그래프를 그릴때, (물론 matplotlib도 충분히 가능하지만) 유용한 모듈인 seaborn을 데리고 한 5회정도 이야기를 할려고 합니다. 꽤 괜찮은 결과를 쉬운 과정을 통해 보여주거든요. Se

pinkwink.kr

 

Matplotlib

 

dailyheumsi.tistory.com/36#%EA%B8%B0%EB%B3%B8-%ED%98%95%ED%83%9C

 

 

파이썬으로 데이터 시각화하기 1편. matplotlib.

쥬피터에서 데이터를 시각화 하는 일반적인 방법을 정리해보려고 한다. 1편은 matplotlib 을 다루는 것으로, 이후에 pandas, seaborn 등으로 다루기 전에, 가장 기초와 기본이 되는 상식이라 할 수 있다.

dailyheumsi.tistory.com

wikidocs.net/92071

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

zephyrus1111.tistory.com/35

 

[파이 차트(Pie chart)] 7. Matplotlib을 이용하여 파이 차트 꾸미기 - 파이 차트에 테두리 추가하기

안녕하세요~ 꽁냥이에요! 이번 포스팅에서는 파이 차트에 테두리를 그려보는 법에 대해서 알아보겠습니다. 파이 차트에 테두리를 추가하는 방법은 pie함수의 wedgeprops 인자를 이용하면 됩니다. we

zephyrus1111.tistory.com

 

다양한 막대그래프 

hleecaster.com/python-matplotlib-bar-graph/

 

[matplotlib] 막대 그래프 - 아무튼 워라밸

파이썬 시각화 라이브러리 matplotlib으로 막대 차트 그리는 방법을 정리했다.

hleecaster.com

 

'Python' 카테고리의 다른 글

파이썬/ sklearn/가장 근사한 방정식 구하기/다항회귀  (0) 2021.11.26
Blending  (0) 2021.11.26
마크다운 요약  (0) 2020.09.29
Python_우리나라 아기이름 데이터 분석  (1) 2020.09.15
Python_데이터분석2  (0) 2020.09.15

https://velog.io/@inbdni/%EB%A7%88%ED%81%AC%EB%8B%A4%EC%9A%B4%EB%AC%B8%EB%B2%95

 

'Python' 카테고리의 다른 글

Blending  (0) 2021.11.26
Seaborn, Matplotlib  (0) 2020.10.04
Python_우리나라 아기이름 데이터 분석  (1) 2020.09.15
Python_데이터분석2  (0) 2020.09.15
Python_판다스_데이터분석  (0) 2020.09.14
200915_2
In [118]:
import pandas as pd
import numpy as np
import matplotlib.font_manager as fm
font_path = 'C:/Windows/Fonts/NGULIM.TTF'
fontprop = fm.FontProperties(fname=font_path, size=15)
font_family = fm.FontProperties(fname=font_path).get_name()

plt.rcParams["font.family"] = font_family
In [119]:
years = range(2008,2021)
pieces = [] #전체 연도의 리스트를 합칠 것
columns = ['name','gender','births']

for year in years:
    path = 'korea/y{}.txt'.format(year)
    frame = pd.read_csv(path,names=columns)
    frame['year']=year
    pieces.append(frame)

names = pd.concat(pieces,ignore_index=True)
In [120]:
names
Out[120]:
name gender births year
0 서연 F 3280 2008
1 민서 F 2873 2008
2 지민 F 2826 2008
3 서현 F 2606 2008
4 서윤 F 2484 2008
... ... ... ... ...
12995 민승 M 20 2020
12996 규담 M 20 2020
12997 영웅 M 20 2020
12998 재성 M 20 2020
12999 주빈 M 20 2020

13000 rows × 4 columns

In [150]:
total_births = names.pivot_table('births', index='year',columns='gender',aggfunc=sum)
total_births
Out[150]:
gender F M
year
2008 191282 169063
2009 186337 166347
2010 195842 177375
2011 199164 180055
2012 204024 185399
2013 189671 173103
2014 187089 174520
2015 190049 178228
2016 176951 165692
2017 154957 148076
2018 144814 137774
2019 133687 128559
2020 52482 50294
In [121]:
total_births = names.pivot_table('births', index='year',columns='gender',aggfunc=sum)
total_births.plot(title='total births(gender/year)')
Out[121]:
<matplotlib.axes._subplots.AxesSubplot at 0x19294539b50>
In [122]:
def add_prop(group):
    group['prop'] = group.births / group.births.sum()
    return group
In [123]:
names = names.groupby(['year','gender']).apply(add_prop)
names
Out[123]:
name gender births year prop
0 서연 F 3280 2008 0.017147
1 민서 F 2873 2008 0.015020
2 지민 F 2826 2008 0.014774
3 서현 F 2606 2008 0.013624
4 서윤 F 2484 2008 0.012986
... ... ... ... ... ...
12995 민승 M 20 2020 0.000398
12996 규담 M 20 2020 0.000398
12997 영웅 M 20 2020 0.000398
12998 재성 M 20 2020 0.000398
12999 주빈 M 20 2020 0.000398

13000 rows × 5 columns

In [124]:
names.groupby(['year','gender']).prop.sum()
Out[124]:
year  gender
2008  F         1.0
      M         1.0
2009  F         1.0
      M         1.0
2010  F         1.0
      M         1.0
2011  F         1.0
      M         1.0
2012  F         1.0
      M         1.0
2013  F         1.0
      M         1.0
2014  F         1.0
      M         1.0
2015  F         1.0
      M         1.0
2016  F         1.0
      M         1.0
2017  F         1.0
      M         1.0
2018  F         1.0
      M         1.0
2019  F         1.0
      M         1.0
2020  F         1.0
      M         1.0
Name: prop, dtype: float64

연도별/성별에 따른 선호하는 이름 100개 추출

In [161]:
names
Out[161]:
name gender births year prop
0 서연 F 3280 2008 0.017147
1 민서 F 2873 2008 0.015020
2 지민 F 2826 2008 0.014774
3 서현 F 2606 2008 0.013624
4 서윤 F 2484 2008 0.012986
... ... ... ... ... ...
12995 민승 M 20 2020 0.000398
12996 규담 M 20 2020 0.000398
12997 영웅 M 20 2020 0.000398
12998 재성 M 20 2020 0.000398
12999 주빈 M 20 2020 0.000398

13000 rows × 5 columns

In [125]:
def get_top100(group):
    return group.sort_values(by='births',ascending=False)[:100]
In [159]:
grouped = names.groupby(['year','gender'])
top100 = grouped.apply(get_top100)
top100
Out[159]:
name gender births year prop
year gender
2008 F 0 서연 F 3280 2008 0.017147
1 민서 F 2873 2008 0.015020
2 지민 F 2826 2008 0.014774
3 서현 F 2606 2008 0.013624
4 서윤 F 2484 2008 0.012986
... ... ... ... ... ... ... ...
2020 M 12597 승민 M 126 2020 0.002505
12598 시환 M 126 2020 0.002505
12595 재하 M 126 2020 0.002505
12596 태준 M 126 2020 0.002505
12599 서율 M 122 2020 0.002426

2600 rows × 5 columns

In [160]:
top100.reset_index(inplace = True , drop = True)
top100
Out[160]:
name gender births year prop
0 서연 F 3280 2008 0.017147
1 민서 F 2873 2008 0.015020
2 지민 F 2826 2008 0.014774
3 서현 F 2606 2008 0.013624
4 서윤 F 2484 2008 0.012986
... ... ... ... ... ...
2595 승민 M 126 2020 0.002505
2596 시환 M 126 2020 0.002505
2597 재하 M 126 2020 0.002505
2598 태준 M 126 2020 0.002505
2599 서율 M 122 2020 0.002426

2600 rows × 5 columns

상위 100개의 이름데이터를 남자(boys)와 여자(girls)로 분리

In [163]:
boys = top100[top100.gender == 'M']
girls = top100[top100.gender == 'F']
In [164]:
total_births = top100.pivot_table('births',index ='year',columns='name',aggfunc=sum)
total_births.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 13 entries, 2008 to 2020
Columns: 321 entries, 가연 to 혜인
dtypes: float64(321)
memory usage: 32.7 KB
In [165]:
total_births
Out[165]:
name 가연 가영 가온 가윤 가은 가현 강민 건우 건호 ... 현수 현아 현우 현준 현지 현진 현호 형준 혜원 혜인
year
2008 772.0 737.0 NaN NaN 1571.0 728.0 NaN 532.0 1703.0 NaN ... 768.0 NaN 1924.0 1615.0 991.0 498.0 NaN 472.0 1007.0 NaN
2009 664.0 642.0 NaN NaN 1703.0 677.0 519.0 489.0 1784.0 NaN ... 687.0 NaN 1909.0 1691.0 891.0 NaN NaN NaN 914.0 NaN
2010 652.0 598.0 NaN 554.0 1651.0 680.0 527.0 NaN 1945.0 531.0 ... 701.0 576.0 2064.0 1989.0 822.0 NaN 494.0 NaN 1070.0 NaN
2011 NaN NaN NaN 734.0 1420.0 635.0 531.0 NaN 1746.0 NaN ... 583.0 586.0 2032.0 1785.0 687.0 NaN NaN NaN 966.0 646.0
2012 640.0 NaN NaN 720.0 1333.0 659.0 493.0 NaN 2050.0 NaN ... 517.0 NaN 2055.0 1560.0 NaN NaN NaN NaN 725.0 NaN
2013 NaN NaN NaN 782.0 1121.0 NaN 454.0 NaN 1577.0 NaN ... 468.0 NaN 1861.0 1426.0 NaN NaN NaN NaN 660.0 NaN
2014 NaN NaN NaN 600.0 1044.0 NaN NaN 485.0 1349.0 NaN ... NaN NaN 1784.0 1427.0 NaN NaN NaN NaN 694.0 NaN
2015 NaN NaN 1123.0 588.0 889.0 NaN NaN 514.0 1479.0 NaN ... NaN NaN 1837.0 1294.0 NaN NaN NaN NaN 561.0 NaN
2016 NaN NaN 518.0 500.0 899.0 NaN 429.0 462.0 1524.0 NaN ... NaN NaN 1486.0 1000.0 NaN NaN NaN NaN NaN NaN
2017 NaN NaN 480.0 NaN 831.0 NaN NaN NaN 1297.0 NaN ... NaN NaN 1224.0 767.0 NaN NaN NaN NaN NaN NaN
2018 NaN NaN NaN NaN 594.0 NaN NaN NaN 1287.0 NaN ... NaN NaN 1068.0 702.0 NaN NaN NaN NaN NaN NaN
2019 NaN NaN NaN NaN 553.0 NaN NaN 320.0 1404.0 NaN ... NaN NaN 903.0 596.0 NaN NaN NaN NaN NaN NaN
2020 NaN NaN NaN NaN 173.0 NaN NaN 135.0 536.0 NaN ... NaN NaN 349.0 182.0 NaN NaN NaN NaN NaN NaN

13 rows × 321 columns

In [166]:
total_births[['민준','하준','서연','지우']]
Out[166]:
name 민준 하준 서연 지우
year
2008 2642.0 NaN 3280.0 2815.0
2009 3103.0 496.0 3514.0 3541.0
2010 3601.0 678.0 3518.0 3762.0
2011 4026.0 1160.0 3111.0 3933.0
2012 3691.0 1210.0 3250.0 3938.0
2013 2769.0 1454.0 3133.0 3749.0
2014 4137.0 2977.0 3334.0 3508.0
2015 3821.0 3053.0 3015.0 3783.0
2016 2959.0 2894.0 2551.0 3270.0
2017 2246.0 2723.0 2075.0 2734.0
2018 2022.0 2627.0 1784.0 2572.0
2019 1648.0 2309.0 1406.0 2320.0
2020 586.0 858.0 511.0 901.0
In [130]:
subset = total_births[['민준','하준','서연','지우']]
subset.plot(subplots=True,figsize=(12,10),grid=False,title='Number of birth per year')
Out[130]:
array([<matplotlib.axes._subplots.AxesSubplot object at 0x000001929A4731C0>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x000001929A494460>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x000001929A4B26A0>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x000001929A4DE820>],
      dtype=object)
In [168]:
table = top100.pivot_table('prop', index = 'year',columns='gender',aggfunc=sum)
table
Out[168]:
gender F M
year
2008 0.578999 0.527945
2009 0.579783 0.538014
2010 0.571665 0.539687
2011 0.570670 0.551487
2012 0.574947 0.552797
2013 0.582466 0.556796
2014 0.595898 0.576415
2015 0.593721 0.578102
2016 0.588982 0.575888
2017 0.593945 0.582100
2018 0.599030 0.593791
2019 0.599991 0.603443
2020 0.604493 0.611663
In [173]:
import matplotlib.pyplot as plt
plt.figure()
table = top100.pivot_table('prop', index = 'year',columns='gender',aggfunc=sum)

table.plot(title='Sum of table100.prop by year and sex',
           yticks=np.linspace(0.5, 0.7, 5), xticks=range(2008, 2021, 1))
Out[173]:
<matplotlib.axes._subplots.AxesSubplot at 0x1929b8cd550>
<Figure size 432x288 with 0 Axes>
In [179]:
df = boys[boys.year == 2010]
df
Out[179]:
name gender births year prop
500 민준 M 3601 2010 0.020302
501 지훈 M 2106 2010 0.011873
502 예준 M 2076 2010 0.011704
503 현우 M 2064 2010 0.011636
504 지호 M 2058 2010 0.011603
... ... ... ... ... ...
595 도영 M 482 2010 0.002717
596 승훈 M 481 2010 0.002712
597 재훈 M 479 2010 0.002700
598 상현 M 478 2010 0.002695
599 은우 M 473 2010 0.002667

100 rows × 5 columns

In [185]:
prop_cumsum = df.sort_values(by='prop',ascending=False).prop.cumsum()
prop_cumsum.values.searchsorted(0.5)+1
Out[185]:
86
In [188]:
prop_cumsum[:10]
Out[188]:
500    0.020302
501    0.032175
502    0.043879
503    0.055515
504    0.067118
505    0.078692
506    0.089906
507    0.100871
508    0.111758
509    0.122492
Name: prop, dtype: float64
In [177]:
prop_cumsum.values
Out[177]:
array([0.02030162, 0.03217477, 0.04387879, 0.05551515, 0.06711769,
       0.07869204, 0.08990557, 0.10087104, 0.11175758, 0.1224919 ,
       0.13315292, 0.14364482, 0.15284567, 0.16193939, 0.17068358,
       0.17936011, 0.18793517, 0.19608175, 0.2040592 , 0.21187315,
       0.21932065, 0.22615363, 0.23295278, 0.23966173, 0.24625229,
       0.25280902, 0.25927555, 0.26525722, 0.27121635, 0.2771642 ,
       0.28307259, 0.28867089, 0.29419591, 0.29955743, 0.30474982,
       0.30973925, 0.31471741, 0.31961099, 0.32446512, 0.32927977,
       0.33408316, 0.33875123, 0.34334602, 0.3479408 , 0.3524623 ,
       0.35696124, 0.36139253, 0.36582382, 0.37017054, 0.37451727,
       0.37884144, 0.38308668, 0.38729246, 0.39140803, 0.39545595,
       0.39941367, 0.40336575, 0.40721071, 0.41103312, 0.41477097,
       0.41845243, 0.42212826, 0.42577026, 0.42938971, 0.43299789,
       0.43660606, 0.44016913, 0.44361381, 0.44700775, 0.45040169,
       0.45373362, 0.45704863, 0.46035236, 0.46363354, 0.46686399,
       0.47008879, 0.47323467, 0.47637491, 0.47950388, 0.48255955,
       0.48560958, 0.48863707, 0.49165891, 0.49466949, 0.49766314,
       0.50063425, 0.50356589, 0.5064919 , 0.50940662, 0.51226498,
       0.51510078, 0.51789711, 0.52068781, 0.52347287, 0.52619591,
       0.52891332, 0.53162509, 0.53432558, 0.53702044, 0.5396871 ])
In [189]:
df = boys[boys.year == 2020]
y2020 = df.sort_values(by='prop',ascending=False).prop.cumsum()
y2020.values.searchsorted(0.5)+1
Out[189]:
64
In [136]:
def get_quantile_count(group, q=0.5):
    group = group.sort_values(by='prop', ascending=False)
    return group.prop.cumsum().values.searchsorted(q) + 1

diversity = top100.groupby(['year', 'gender']).apply(get_quantile_count)
diversity = diversity.unstack('gender')
fig = plt.figure()
diversity.plot(title="Number of popular names in top 50%")
Out[136]:
<matplotlib.axes._subplots.AxesSubplot at 0x1929a22f1f0>
<Figure size 432x288 with 0 Axes>

마지막 글자의 변화

In [137]:
get_last_letter= lambda x: x[-1]
last_letters= names.name.map(get_last_letter)
last_letters.name= 'last_letter'

table = names.pivot_table('births', index=last_letters, columns=['gender', 'year'], aggfunc=sum)
In [138]:
subtable= table.reindex(columns=[2008,2010,2020], level='year')
subtable.head()
Out[138]:
gender F M
year 2008 2010 2020 2008 2010 2020
last_letter
NaN NaN NaN 106.0 NaN 34.0
NaN NaN NaN 1755.0 2208.0 688.0
NaN NaN NaN NaN NaN NaN
184.0 90.0 NaN 1159.0 968.0 348.0
NaN 65.0 65.0 92.0 NaN 446.0
In [139]:
subtable.sum()
letter_prop= subtable / subtable.sum()
letter_prop
Out[139]:
gender F M
year 2008 2010 2020 2008 2010 2020
last_letter
NaN NaN NaN 0.000627 NaN 0.000676
NaN NaN NaN 0.010381 0.012448 0.013680
NaN NaN NaN NaN NaN NaN
0.000962 0.000460 NaN 0.006855 0.005457 0.006919
NaN 0.000332 0.001239 0.000544 NaN 0.008868
... ... ... ... ... ... ...
0.003220 0.003467 0.000457 0.012120 0.025872 0.029427
NaN NaN NaN 0.044309 0.038269 0.019684
NaN NaN NaN NaN NaN NaN
NaN NaN NaN 0.001686 0.001466 0.001153
0.035534 0.033262 0.022351 0.012705 0.011704 0.006939

128 rows × 6 columns

In [140]:
import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 1, figsize=(30, 11))
letter_prop['M'].plot(kind='bar', rot=0, ax=axes[0], title='Male')
letter_prop['F'].plot(kind='bar', rot=0, ax=axes[1], title='Female',
                      legend=False)
Out[140]:
<matplotlib.axes._subplots.AxesSubplot at 0x1929a6d2c10>
In [141]:
letter_prop= table / table.sum()
dny_ts= letter_prop.loc[['우','준', '현'], 'M'].T 
dny_ts.head()
Out[141]:
last_letter
year
2008 0.098378 0.095745 0.088730
2009 0.106945 0.103008 0.077567
2010 0.112214 0.112383 0.072896
2011 0.113082 0.118197 0.073600
2012 0.120518 0.116748 0.074191
In [142]:
plt.close()
fig= plt.figure()
dny_ts.plot()
Out[142]:
<matplotlib.axes._subplots.AxesSubplot at 0x1929d75ea60>
<Figure size 432x288 with 0 Axes>

남자이름>여자이름
공통부분: 진

In [144]:
all_names = pd.Series(top100.name.unique())
jin_like = all_names[all_names.str.lower().str.contains('진')]
jin_like
Out[144]:
10     유진
13     예진
28     서진
53     수진
104    우진
125    진우
177    현진
270    하진
dtype: object
In [145]:
filtered = top100[top100.name.isin(jin_like)]
filtered.groupby('name').births.sum()
Out[145]:
name
서진    25862
수진     2884
예진    13152
우진    18955
유진    14801
진우    10936
하진     4010
현진      498
Name: births, dtype: int64
In [146]:
table = filtered.pivot_table('births', index='year',
                             columns='gender', aggfunc='sum')
table = table.div(table.sum(1), axis=0)
table.tail()
Out[146]:
gender F M
year
2016 0.337038 0.662962
2017 0.303000 0.697000
2018 0.328807 0.671193
2019 0.288462 0.711538
2020 0.269565 0.730435
In [147]:
fig = plt.figure()
table.plot(style={'M': 'k-', 'F': 'b--'})
Out[147]:
<matplotlib.axes._subplots.AxesSubplot at 0x1929b62d100>
<Figure size 432x288 with 0 Axes>
In [ ]:
 

'Python' 카테고리의 다른 글

Seaborn, Matplotlib  (0) 2020.10.04
마크다운 요약  (0) 2020.09.29
Python_데이터분석2  (0) 2020.09.15
Python_판다스_데이터분석  (0) 2020.09.14
Python_example  (0) 2020.09.11
200915
In [17]:
import pandas as pd 
import numpy as np
In [18]:
name_1880= pd.read_csv('data2/yob1880.txt', names= ['name', 'gender', 'births'])
name_1880
Out[18]:
name gender births
0 Mary F 7065
1 Anna F 2604
2 Emma F 2003
3 Elizabeth F 1939
4 Minnie F 1746
... ... ... ...
1995 Woodie M 5
1996 Worthy M 5
1997 Wright M 5
1998 York M 5
1999 Zachariah M 5

2000 rows × 3 columns

In [19]:
name_1880.groupby('gender').births.sum()
Out[19]:
gender
F     90993
M    110493
Name: births, dtype: int64
In [20]:
years= range(1880,2011)
pieces= []
columns= ['name','gender','births']

for year in years:
    path= 'data2/yob{}.txt.'.format(year)
    frame= pd.read_csv(path, names=columns)
    frame['year']= year
    pieces.append(frame)
names= pd.concat(pieces, ignore_index= True)
In [21]:
names
Out[21]:
name gender births year
0 Mary F 7065 1880
1 Anna F 2604 1880
2 Emma F 2003 1880
3 Elizabeth F 1939 1880
4 Minnie F 1746 1880
... ... ... ... ...
1690779 Zymaire M 5 2010
1690780 Zyonne M 5 2010
1690781 Zyquarius M 5 2010
1690782 Zyran M 5 2010
1690783 Zzyzx M 5 2010

1690784 rows × 4 columns

In [22]:
total_births= names.pivot_table('births', index='year', columns='gender', aggfunc=sum)
total_births.plot(title='Total births(gender / year)')
Out[22]:
<matplotlib.axes._subplots.AxesSubplot at 0x207c061d7f0>
In [64]:
def add_prop(group):
    group['prop'] = group.births / group.births.sum()
    return group
In [65]:
name= names.groupby(['year', 'gender']).apply(add_prop)
name
Out[65]:
name gender births year prop
0 Mary F 7065 1880 0.077643
1 Anna F 2604 1880 0.028618
2 Emma F 2003 1880 0.022013
3 Elizabeth F 1939 1880 0.021309
4 Minnie F 1746 1880 0.019188
... ... ... ... ... ...
1690779 Zymaire M 5 2010 0.000003
1690780 Zyonne M 5 2010 0.000003
1690781 Zyquarius M 5 2010 0.000003
1690782 Zyran M 5 2010 0.000003
1690783 Zzyzx M 5 2010 0.000003

1690784 rows × 5 columns

Mary prop:0.077643은 1880년도에 태어난 여자 중에서 약 0.078%차지

In [66]:
names = names.groupby(['year','gender']).apply(add_prop)
names
Out[66]:
name gender births year prop
0 Mary F 7065 1880 0.077643
1 Anna F 2604 1880 0.028618
2 Emma F 2003 1880 0.022013
3 Elizabeth F 1939 1880 0.021309
4 Minnie F 1746 1880 0.019188
... ... ... ... ... ...
1690779 Zymaire M 5 2010 0.000003
1690780 Zyonne M 5 2010 0.000003
1690781 Zyquarius M 5 2010 0.000003
1690782 Zyran M 5 2010 0.000003
1690783 Zzyzx M 5 2010 0.000003

1690784 rows × 5 columns

연도별 / 성별에 따른 선호하는 이름 1000개 추출

In [67]:
def get_top1000(group):
    return group.sort_values(by='births', ascending=False)[:1000]
In [68]:
grouped= names.groupby(['year','gender'])
top1000= grouped.apply(get_top1000)
top1000
Out[68]:
name gender births year prop
year gender
1880 F 0 Mary F 7065 1880 0.077643
1 Anna F 2604 1880 0.028618
2 Emma F 2003 1880 0.022013
3 Elizabeth F 1939 1880 0.021309
4 Minnie F 1746 1880 0.019188
... ... ... ... ... ... ... ...
2010 M 1677639 Camilo M 194 2010 0.000102
1677640 Destin M 194 2010 0.000102
1677641 Jaquan M 194 2010 0.000102
1677642 Jaydan M 194 2010 0.000102
1677645 Maxton M 193 2010 0.000102

261877 rows × 5 columns

In [69]:
top1000.reset_index(inplace=True, drop=True)
top1000
Out[69]:
name gender births year prop
0 Mary F 7065 1880 0.077643
1 Anna F 2604 1880 0.028618
2 Emma F 2003 1880 0.022013
3 Elizabeth F 1939 1880 0.021309
4 Minnie F 1746 1880 0.019188
... ... ... ... ... ...
261872 Camilo M 194 2010 0.000102
261873 Destin M 194 2010 0.000102
261874 Jaquan M 194 2010 0.000102
261875 Jaydan M 194 2010 0.000102
261876 Maxton M 193 2010 0.000102

261877 rows × 5 columns

상위 1000개의 이름데이터를 남자(boys)와 여자(grils)로 분리

In [70]:
boys= top1000[top1000.gender== 'M']
girls= top1000[top1000.gender== 'F']
  • 연도와 출생수를 피봇테이블로 변환
In [71]:
total_births = top1000.pivot_table('births', index='year', columns='name', aggfunc=sum)
total_births.info() 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 131 entries, 1880 to 2010
Columns: 6868 entries, Aaden to Zuri
dtypes: float64(6868)
memory usage: 6.9 MB
In [72]:
total_births.head()
Out[72]:
name Aaden Aaliyah Aarav Aaron Aarush Ab Abagail Abb Abbey Abbie ... Zoa Zoe Zoey Zoie Zola Zollie Zona Zora Zula Zuri
year
1880 NaN NaN NaN 102.0 NaN NaN NaN NaN NaN 71.0 ... 8.0 23.0 NaN NaN 7.0 NaN 8.0 28.0 27.0 NaN
1881 NaN NaN NaN 94.0 NaN NaN NaN NaN NaN 81.0 ... NaN 22.0 NaN NaN 10.0 NaN 9.0 21.0 27.0 NaN
1882 NaN NaN NaN 85.0 NaN NaN NaN NaN NaN 80.0 ... 8.0 25.0 NaN NaN 9.0 NaN 17.0 32.0 21.0 NaN
1883 NaN NaN NaN 105.0 NaN NaN NaN NaN NaN 79.0 ... NaN 23.0 NaN NaN 10.0 NaN 11.0 35.0 25.0 NaN
1884 NaN NaN NaN 97.0 NaN NaN NaN NaN NaN 98.0 ... 13.0 31.0 NaN NaN 14.0 6.0 8.0 58.0 27.0 NaN

5 rows × 6868 columns

In [73]:
subset = total_births[['John','Harry','Mary','Alice']]
subset.plot(subplots=True,figsize =(12,10), grid=False,
           title='Number of birth per year')
Out[73]:
array([<matplotlib.axes._subplots.AxesSubplot object at 0x00000207B9D5A370>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x00000207B3CD0190>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x00000207B40C83D0>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x00000207B40F5550>],
      dtype=object)
In [74]:
import matplotlib.pyplot as plt
plt.figure()
table = top1000.pivot_table('prop', index = 'year',columns='gender',aggfunc=sum)

table.plot(title='Sum of table1000.prop by year and sex',
           yticks=np.linspace(0, 1.2, 13), xticks=range(1880, 2020, 10))
Out[74]:
<matplotlib.axes._subplots.AxesSubplot at 0x207c293fe20>
<Figure size 432x288 with 0 Axes>
In [75]:
df = boys[boys.year == 2010]
df
Out[75]:
name gender births year prop
260877 Jacob M 21875 2010 0.011523
260878 Ethan M 17866 2010 0.009411
260879 Michael M 17133 2010 0.009025
260880 Jayden M 17030 2010 0.008971
260881 William M 16870 2010 0.008887
... ... ... ... ... ...
261872 Camilo M 194 2010 0.000102
261873 Destin M 194 2010 0.000102
261874 Jaquan M 194 2010 0.000102
261875 Jaydan M 194 2010 0.000102
261876 Maxton M 193 2010 0.000102

1000 rows × 5 columns

In [76]:
prop_cumsum = df.sort_values(by='prop',ascending=False).prop.cumsum()
prop_cumsum[:10]
prop_cumsum.values.searchsorted(0.5)+1
Out[76]:
117

가정: 흔한 이름 쓰는 걸 좋아하지 않는다.

In [77]:
df= boys[boys.year == 1910] 
y1910= df.sort_values(by='prop', ascending= False).prop.cumsum()
y1910.values.searchsorted(0.5)+1
Out[77]:
31
In [78]:
def get_quantile_count(group, q=0.5):
    group = group.sort_values(by='prop', ascending=False)
    return group.prop.cumsum().values.searchsorted(q) + 1

diversity = top1000.groupby(['year', 'gender']).apply(get_quantile_count)
diversity = diversity.unstack('gender')
fig = plt.figure()
diversity.plot(title="Number of popular names in top 50%")
Out[78]:
<matplotlib.axes._subplots.AxesSubplot at 0x207b4679f40>
<Figure size 432x288 with 0 Axes>

마지막 글자의 변화

In [80]:
get_last_letter= lambda x: x[-1]
last_letters= names.name.map(get_last_letter)
last_letters.name= 'last_letter'

table = names.pivot_table('births', index=last_letters, columns=['gender', 'year'], aggfunc=sum)
In [81]:
subtable= table.reindex(columns=[1910,1960,2010], level='year')
subtable.head()
Out[81]:
gender F M
year 1910 1960 2010 1910 1960 2010
last_letter
a 108376.0 691247.0 670605.0 977.0 5204.0 28438.0
b NaN 694.0 450.0 411.0 3912.0 38859.0
c 5.0 49.0 946.0 482.0 15476.0 23125.0
d 6750.0 3729.0 2607.0 22111.0 262112.0 44398.0
e 133569.0 435013.0 313833.0 28655.0 178823.0 129012.0
In [83]:
subtable.sum()
letter_prop= subtable / subtable.sum()
letter_prop
Out[83]:
gender F M
year 1910 1960 2010 1910 1960 2010
last_letter
a 0.273390 0.341853 0.381240 0.005031 0.002440 0.014980
b NaN 0.000343 0.000256 0.002116 0.001834 0.020470
c 0.000013 0.000024 0.000538 0.002482 0.007257 0.012181
d 0.017028 0.001844 0.001482 0.113858 0.122908 0.023387
e 0.336941 0.215133 0.178415 0.147556 0.083853 0.067959
f NaN 0.000010 0.000055 0.000783 0.004325 0.001188
g 0.000144 0.000157 0.000374 0.002250 0.009488 0.001404
h 0.051529 0.036224 0.075852 0.045562 0.037907 0.051670
i 0.001526 0.039965 0.031734 0.000844 0.000603 0.022628
j NaN NaN 0.000090 NaN NaN 0.000769
k 0.000121 0.000156 0.000356 0.036581 0.049384 0.018541
l 0.043189 0.033867 0.026356 0.065016 0.104904 0.070367
m 0.001201 0.008613 0.002588 0.058044 0.033827 0.024657
n 0.079240 0.130687 0.140210 0.143415 0.152522 0.362771
o 0.001660 0.002439 0.001243 0.017065 0.012829 0.042681
p 0.000018 0.000023 0.000020 0.003172 0.005675 0.001269
q NaN NaN 0.000030 NaN NaN 0.000180
r 0.013390 0.006764 0.018025 0.064481 0.031034 0.087477
s 0.039042 0.012764 0.013332 0.130815 0.102730 0.065145
t 0.027438 0.015201 0.007830 0.072879 0.065655 0.022861
u 0.000684 0.000574 0.000417 0.000124 0.000057 0.001221
v NaN 0.000060 0.000117 0.000113 0.000037 0.001434
w 0.000020 0.000031 0.001182 0.006329 0.007711 0.016148
x 0.000015 0.000037 0.000727 0.003965 0.001851 0.008614
y 0.110972 0.152569 0.116828 0.077349 0.160987 0.058168
z 0.002439 0.000659 0.000704 0.000170 0.000184 0.001831
In [84]:
import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 1, figsize=(15, 11))
letter_prop['M'].plot(kind='bar', rot=0, ax=axes[0], title='Male')
letter_prop['F'].plot(kind='bar', rot=0, ax=axes[1], title='Female',
                      legend=False)
Out[84]:
<matplotlib.axes._subplots.AxesSubplot at 0x207b4855b80>
In [85]:
letter_prop= table / table.sum()
dny_ts= letter_prop.loc[['d','n','y'], 'M'].T 
dny_ts.head()
Out[85]:
last_letter d n y
year
1880 0.083055 0.153213 0.075760
1881 0.083247 0.153214 0.077451
1882 0.085340 0.149560 0.077537
1883 0.084066 0.151646 0.079144
1884 0.086120 0.149915 0.080405
In [86]:
plt.close()
fig= plt.figure()
dny_ts.plot()
Out[86]:
<matplotlib.axes._subplots.AxesSubplot at 0x207c0ec6d90>
<Figure size 432x288 with 0 Axes>

남자이름>여자이름 Lesley or Leslie
공통부분: Lesl

In [89]:
all_names = pd.Series(top1000.name.unique())
lesley_like = all_names[all_names.str.lower().str.contains('lesl')]
lesley_like
Out[89]:
632     Leslie
2294    Lesley
4262    Leslee
4728     Lesli
6103     Lesly
dtype: object
In [91]:
filtered = top1000[top1000.name.isin(lesley_like)]
filtered.groupby('name').births.sum()
Out[91]:
name
Leslee      1082
Lesley     35022
Lesli        929
Leslie    370429
Lesly      10067
Name: births, dtype: int64
In [92]:
table = filtered.pivot_table('births', index='year',
                             columns='gender', aggfunc='sum')
table = table.div(table.sum(1), axis=0)
table.tail()
Out[92]:
gender F M
year
2006 1.0 NaN
2007 1.0 NaN
2008 1.0 NaN
2009 1.0 NaN
2010 1.0 NaN
In [93]:
fig = plt.figure()
table.plot(style={'M': 'k-', 'F': 'b--'})
Out[93]:
<matplotlib.axes._subplots.AxesSubplot at 0x207c70116d0>
<Figure size 432x288 with 0 Axes>
200914
In [1]:
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt

read_csv로 데이터를 Dataframe형태로 불러옴

In [2]:
file_path='data/drinks.csv'
drinks=pd.read_csv(file_path)
  • info()함수를 통해 결측(NaN)값을 확인할 수 있음
In [3]:
print(drinks.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 193 entries, 0 to 192
Data columns (total 6 columns):
 #   Column                        Non-Null Count  Dtype  
---  ------                        --------------  -----  
 0   country                       193 non-null    object 
 1   beer_servings                 193 non-null    int64  
 2   spirit_servings               193 non-null    int64  
 3   wine_servings                 193 non-null    int64  
 4   total_litres_of_pure_alcohol  193 non-null    float64
 5   continent                     170 non-null    object 
dtypes: float64(1), int64(3), object(2)
memory usage: 9.2+ KB
None
In [4]:
drinks.head(10) #디폴트 값은 5
Out[4]:
country beer_servings spirit_servings wine_servings total_litres_of_pure_alcohol continent
0 Afghanistan 0 0 0 0.0 AS
1 Albania 89 132 54 4.9 EU
2 Algeria 25 0 14 0.7 AF
3 Andorra 245 138 312 12.4 EU
4 Angola 217 57 45 5.9 AF
5 Antigua & Barbuda 102 128 45 4.9 NaN
6 Argentina 193 25 221 8.3 SA
7 Armenia 21 179 11 3.8 EU
8 Australia 261 72 212 10.4 OC
9 Austria 279 75 191 9.7 EU
In [5]:
drinks.describe() # 숫자만 describe로 나옴 
Out[5]:
beer_servings spirit_servings wine_servings total_litres_of_pure_alcohol
count 193.000000 193.000000 193.000000 193.000000
mean 106.160622 80.994819 49.450777 4.717098
std 101.143103 88.284312 79.697598 3.773298
min 0.000000 0.000000 0.000000 0.000000
25% 20.000000 4.000000 1.000000 1.300000
50% 76.000000 56.000000 8.000000 4.200000
75% 188.000000 128.000000 59.000000 7.200000
max 376.000000 438.000000 370.000000 14.400000
In [6]:
corr=drinks[['beer_servings', 'wine_servings']].corr(method='pearson') #두 변수 X 와 Y 간의 선형 상관 관계를 계량화한 수치다
print(corr) # beer가 1일
beer_servings  wine_servings
beer_servings       1.000000       0.527172
wine_servings       0.527172       1.000000
In [7]:
cols=['beer_servings','spirit_servings','wine_servings','total_litres_of_pure_alcohol']
corr= drinks[cols].corr(method='pearson')
print(corr)
beer_servings  spirit_servings  wine_servings  \
beer_servings                      1.000000         0.458819       0.527172   
spirit_servings                    0.458819         1.000000       0.194797   
wine_servings                      0.527172         0.194797       1.000000   
total_litres_of_pure_alcohol       0.835839         0.654968       0.667598   

                              total_litres_of_pure_alcohol  
beer_servings                                     0.835839  
spirit_servings                                   0.654968  
wine_servings                                     0.667598  
total_litres_of_pure_alcohol                      1.000000  
In [8]:
corr.values
Out[8]:
array([[1.        , 0.45881887, 0.52717169, 0.83583863],
       [0.45881887, 1.        , 0.19479705, 0.65496818],
       [0.52717169, 0.19479705, 1.        , 0.66759834],
       [0.83583863, 0.65496818, 0.66759834, 1.        ]])

heatmap[heat(열)+map(지도)]: 데이터들의 배열을 색상으로 표현해주는 그래프

  • heatmap을 사용하면 두 개의 카테고리 값에 대한 값 변화를 한눈에 알기 쉬움
  • 대용량 데이터도 쉽게 표현 가능
In [9]:
import seaborn as sns
# corr 행렬 히트맵을 시각화합니다.
cols_view = ['beer', 'spirit', 'wine', 'alcohol'] # 그래프 출력을 위한 cols 이름을 축약합니다.
sns.set(font_scale=1.5)
hm = sns.heatmap(corr.values,
            cbar=True, #컬러바 유무
            annot=True, # 각 셀에 숫자 입력 
            fmt='.2f', #둘째자리까지
            square=True,
            annot_kws={'size': 15}, #숫자 크기 조절 
            yticklabels=cols_view,
            xticklabels=cols_view)

plt.tight_layout() # 여백
plt.show()
In [10]:
# 시각화 라이브러리를 이용한 피처간의 scatter plot을 출력합니다.
sns.set(style='whitegrid', context='notebook')
sns.pairplot(drinks[['beer_servings', 'spirit_servings', 
                     'wine_servings', 'total_litres_of_pure_alcohol']], height=2.5)
plt.show()
# 점 하나는 나라 하나

correlation : 각 숫자형 변수들 간의 상관관계를 나타낸 계수

  • 1~0.7는 강한 양의 상관관계 ex) y = x
  • 0.7~-1은 강한 음의 상관관계 ex) y= -x
    (0에 가까울 수록 두 변수들 간의 상관이 없다)

scatterplot(산점도) : 탐색적 분석에서 필수적으로 사용하며 각 점들을 찍은 그래프(역시 숫자형 변수들만)

  • 그래프를 이용하여 각 변수들 간의 상관관계나 모양 같은 것을 봄
  • y = x 와 같은 상관관계를 쉽게 볼 수 있고, 다른 관계도 추측할 수 있다.

결측 데이터 전처리

In [11]:
print(drinks.isnull().sum())
print("----------------------------------------")
print(drinks.dtypes)
country                          0
beer_servings                    0
spirit_servings                  0
wine_servings                    0
total_litres_of_pure_alcohol     0
continent                       23
dtype: int64
----------------------------------------
country                          object
beer_servings                     int64
spirit_servings                   int64
wine_servings                     int64
total_litres_of_pure_alcohol    float64
continent                        object
dtype: object
  • 결측 데이터 채우기
In [12]:
drinks['continent']=drinks['continent'].fillna('OT') #OT=OTHER
In [13]:
print(drinks.isnull().sum())
country                         0
beer_servings                   0
spirit_servings                 0
wine_servings                   0
total_litres_of_pure_alcohol    0
continent                       0
dtype: int64
In [14]:
print(drinks.info()) # 5번 193으로 달라짐
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 193 entries, 0 to 192
Data columns (total 6 columns):
 #   Column                        Non-Null Count  Dtype  
---  ------                        --------------  -----  
 0   country                       193 non-null    object 
 1   beer_servings                 193 non-null    int64  
 2   spirit_servings               193 non-null    int64  
 3   wine_servings                 193 non-null    int64  
 4   total_litres_of_pure_alcohol  193 non-null    float64
 5   continent                     193 non-null    object 
dtypes: float64(1), int64(3), object(2)
memory usage: 9.2+ KB
None
In [15]:
labels= drinks['continent'].value_counts().index.tolist() #index를 리스트로 만들고
fracs1=drinks['continent'].value_counts().values.tolist() #continent의 valuses를 리스트로 
explode= (0,0,0,0.25,0,0)
plt.pie(fracs1,explode=explode, labels=labels, autopct='%.0f%%', shadow=True) #shadow=True 그림자 붙이기 
plt.title("NULL Data to 'OT'")
plt.show()
In [16]:
labels= drinks['continent'].value_counts().index.tolist()
print(labels)
['AF', 'EU', 'AS', 'OT', 'OC', 'SA']
In [17]:
fracs1=drinks['continent'].value_counts().values.tolist()
print(fracs1)
[53, 45, 44, 23, 16, 12]
In [18]:
#plt.rcParams.update({'font.size': 15}) #(1)
plt.figure(figsize=(5,5)) #그림크기
#plt.rc('font',size=15) #폰트크기 (2)
explode= (0,0,0,0.2,0,0)
plt.pie(fracs1, #데이터값,values, 
explode=explode, #파이에서 튀어나오는 위치 
labels=labels, 
colors=None, 
autopct='%.1f%%',
pctdistance=0.6, 
shadow=False,
labeldistance=1.1, 
startangle=230, # 90넣으면 반시계방향으로 90도 돔
radius=None, 
counterclock=True, #반시계방향, False하면 위치바뀜 
wedgeprops=None, 
textprops=None, 
center=(0, 0), 
frame=False, 
rotatelabels=False)
plt.title("NULL Data to 'OT'")
plt.show()
#plt.rcParams.update({'font.size': 15}) (1)
plt.rc('font',size=10) #폰트 크기를 원래대로 지정 (2)
In [19]:
result=drinks.groupby('continent').spirit_servings.agg(['mean','min','max','sum'])
result.head(10)
Out[19]:
mean min max sum
continent
AF 16.339623 0 152 866
AS 60.840909 0 326 2677
EU 132.555556 0 373 5965
OC 58.437500 0 254 935
OT 165.739130 68 438 3812
SA 114.750000 25 302 1377
In [20]:
result=drinks.groupby('continent').spirit_servings. \
        agg(['count','mean','min','max','sum','var','std']) #agg함수: 여러 개 적용할 때 사용/ var:분산, std:표준편차
result.head(10)
Out[20]:
count mean min max sum var std
continent
AF 53 16.339623 0 152 866 789.767054 28.102794
AS 44 60.840909 0 326 2677 7116.974101 84.362160
EU 45 132.555556 0 373 5965 6020.070707 77.589115
OC 16 58.437500 0 254 935 4970.929167 70.504817
OT 23 165.739130 68 438 3812 9023.837945 94.993884
SA 12 114.750000 25 302 1377 5940.931818 77.077440
In [21]:
result=drinks.groupby('continent').beer_servings. \
        agg(['count','mean','min','max','sum','var','std']) #agg함수: 여러 개 적용할 때 사용/ var:분산, std:표준편차
result.head(10)
Out[21]:
count mean min max sum var std
continent
AF 53 61.471698 0 376 3258 6489.561684 80.557816
AS 44 37.045455 0 247 1630 2447.253700 49.469725
EU 45 193.777778 0 361 8720 9926.449495 99.631569
OC 16 89.687500 0 306 1435 9339.562500 96.641412
OT 23 145.434783 1 285 3345 6339.529644 79.621163
SA 12 175.083333 93 333 2101 4256.628788 65.242845
In [22]:
result=drinks.groupby('continent').wine_servings. \
        agg(['count','mean','min','max','sum','var','std']) #agg함수: 여러 개 적용할 때 사용/ var:분산, std:표준편차
result.head(10)
Out[22]:
count mean min max sum var std
continent
AF 53 16.264151 0 233 862 1509.044267 38.846419
AS 44 9.068182 0 123 399 469.460359 21.667034
EU 45 142.222222 0 370 6400 9490.994949 97.421738
OC 16 35.625000 0 212 570 4167.450000 64.555790
OT 23 24.521739 1 100 564 798.988142 28.266378
SA 12 62.416667 1 221 749 7853.537879 88.620189
In [23]:
result=drinks.groupby('continent').total_litres_of_pure_alcohol. \
        agg(['count','mean','min','max','sum','var','std']) #agg함수: 여러 개 적용할 때 사용/ var:분산, std:표준편차
result.head(10)
Out[23]:
count mean min max sum var std
continent
AF 53 3.007547 0.0 9.1 159.4 7.009557 2.647557
AS 44 2.170455 0.0 11.5 95.5 7.674223 2.770239
EU 45 8.617778 0.0 14.4 387.8 11.279222 3.358455
OC 16 3.381250 0.0 10.4 54.1 11.193625 3.345688
OT 23 5.995652 2.2 11.9 137.9 5.804980 2.409353
SA 12 6.308333 3.8 8.3 75.7 2.344470 1.531166

total_litres_of_pure_alcohol의 전체평균

In [24]:
total_mean=drinks.total_litres_of_pure_alcohol.mean()
total_mean
Out[24]:
4.717098445595855
In [25]:
continent_mean=drinks.groupby('continent')['total_litres_of_pure_alcohol'].mean()
print(continent_mean)
continent
AF    3.007547
AS    2.170455
EU    8.617778
OC    3.381250
OT    5.995652
SA    6.308333
Name: total_litres_of_pure_alcohol, dtype: float64
In [26]:
continent_over_mean=continent_mean[continent_mean >=total_mean]
print(continent_over_mean)
continent
EU    8.617778
OT    5.995652
SA    6.308333
Name: total_litres_of_pure_alcohol, dtype: float64
  • 평균 beer_servings가 가장 높은 대륙
In [27]:
beer_continent= drinks.groupby('continent').beer_servings.mean()
beer_continent
Out[27]:
continent
AF     61.471698
AS     37.045455
EU    193.777778
OC     89.687500
OT    145.434783
SA    175.083333
Name: beer_servings, dtype: float64
In [28]:
beer_continent_max=beer_continent[beer_continent==beer_continent.max()]
beer_continent_max
Out[28]:
continent
EU    193.777778
Name: beer_servings, dtype: float64
In [29]:
beer_continent.idxmax()
Out[29]:
'EU'
In [30]:
beer_continent[beer_continent.idxmax()]
Out[30]:
193.77777777777777
  • 평균 beer_servings가 가장 낮은 대륙
In [31]:
beer_continent_min=beer_continent[beer_continent==beer_continent.min()]
beer_continent_min
Out[31]:
continent
AS    37.045455
Name: beer_servings, dtype: float64
In [32]:
beer_continent.idxmin()
Out[32]:
'AS'
In [33]:
beer_continent[beer_continent.idxmin()]
Out[33]:
37.04545454545455

시각화

  • 대륙별 spirit_servings의 평균,최소,최대를 시각화
In [34]:
result=drinks.groupby('continent').spirit_servings. \
        agg(['mean','min','max','count'])
result.head(10)
Out[34]:
mean min max count
continent
AF 16.339623 0 152 53
AS 60.840909 0 326 44
EU 132.555556 0 373 45
OC 58.437500 0 254 16
OT 165.739130 68 438 23
SA 114.750000 25 302 12
In [35]:
number_groups=len(result.index) 
number_groups
Out[35]:
6
In [36]:
means= result['mean'].tolist()
means
Out[36]:
[16.339622641509433,
 60.84090909090909,
 132.55555555555554,
 58.4375,
 165.7391304347826,
 114.75]
In [37]:
mins= result['min'].tolist()
maxs= result['max'].tolist()
counts= result['count'].tolist() 
index=np.arange(number_groups)

plt.figure(figsize=(10,5)) #그림크기
bar_width= 0.2 #0.8 디폴트 

rects_1= plt.bar(index, means, bar_width, color='r', label='Mean')
rects_2= plt.bar(index+bar_width, mins, bar_width, color='g', label='Min')
rects_3= plt.bar(index+bar_width*2, maxs, bar_width, color='b', label='Max')
rects_4= plt.bar(index+bar_width*3, counts, bar_width, color='y', label='Count')

plt.xticks(index, result.index.tolist())
plt.legend()
plt.show()
  • 대륙별 total_litres_of_pure_alcohol 시각화
In [38]:
continent_mean=drinks.groupby('continent')['total_litres_of_pure_alcohol'].mean()
continent_mean
Out[38]:
continent
AF    3.007547
AS    2.170455
EU    8.617778
OC    3.381250
OT    5.995652
SA    6.308333
Name: total_litres_of_pure_alcohol, dtype: float64
In [39]:
continents= continent_mean.index.tolist()
continents
Out[39]:
['AF', 'AS', 'EU', 'OC', 'OT', 'SA']
In [40]:
continents.append('MEAN')
continents
Out[40]:
['AF', 'AS', 'EU', 'OC', 'OT', 'SA', 'MEAN']
In [41]:
x_pos=np.arange(len(continents)) #그래프 세로
x_pos
Out[41]:
array([0, 1, 2, 3, 4, 5, 6])
In [42]:
alcohol= continent_mean.tolist()
alcohol.append(total_mean)
alcohol
Out[42]:
[3.00754716981132,
 2.1704545454545454,
 8.617777777777777,
 3.3812500000000005,
 5.995652173913044,
 6.308333333333334,
 4.717098445595855]
In [43]:
total_mean
Out[43]:
4.717098445595855
In [44]:
#plt.grid(b=True, which='both', axis='both')
bar_list = plt.bar(x_pos, alcohol, align='center', alpha=0.5) 
bar_list[len(continents) - 1].set_color('r') # 맨 마지막을 빨간색으로 
plt.plot([0., 6], [total_mean, total_mean], "k--") #점선 그리기 
plt.xticks(x_pos, continents)

plt.ylabel('total_litres_of_pure_alcohol')
plt.title('total_litres_of_pure_alcohol by Continent')

plt.show()
In [45]:
#plt.grid(b=True, which='both', axis='both')
bar_list = plt.bar(x_pos, alcohol, align='center', alpha=0.5) 
bar_list[len(continents) - 1].set_color('g') 
plt.plot([0., 6], [total_mean, total_mean], "k--") #점선 그리기 
plt.xticks(x_pos, continents)

plt.ylabel('total_litres_of_pure_alcohol')
plt.title('total_litres_of_pure_alcohol by Continent')

plt.show()
In [46]:
continent_mean
Out[46]:
continent
AF    3.007547
AS    2.170455
EU    8.617778
OC    3.381250
OT    5.995652
SA    6.308333
Name: total_litres_of_pure_alcohol, dtype: float64
In [47]:
#plt.grid(b=True, which='both', axis='both')
bar_list = plt.bar(x_pos, alcohol, align='center', alpha=0.5) 
bar_list[len(continents) - 1].set_color('g') 
plt.plot([3., 5], [continent_mean['SA'], continent_mean['SA']], "k--") #점선 그리기 
plt.xticks(x_pos, continents)

plt.ylabel('total_litres_of_pure_alcohol')
plt.title('total_litres_of_pure_alcohol by Continent')

plt.show()
In [48]:
!pip install scipy
Requirement already satisfied: scipy in c:\users\w\anaconda3\lib\site-packages (1.5.0)
Requirement already satisfied: numpy>=1.14.5 in c:\users\w\anaconda3\lib\site-packages (from scipy) (1.18.5)
In [49]:
africa=drinks.loc[drinks['continent']=='AF']
africa.head()
Out[49]:
country beer_servings spirit_servings wine_servings total_litres_of_pure_alcohol continent
2 Algeria 25 0 14 0.7 AF
4 Angola 217 57 45 5.9 AF
18 Benin 34 4 13 1.1 AF
22 Botswana 173 35 35 5.4 AF
26 Burkina Faso 25 7 7 4.3 AF
In [50]:
europe=drinks.loc[drinks['continent']=='EU']
europe.head()
Out[50]:
country beer_servings spirit_servings wine_servings total_litres_of_pure_alcohol continent
1 Albania 89 132 54 4.9 EU
3 Andorra 245 138 312 12.4 EU
7 Armenia 21 179 11 3.8 EU
9 Austria 279 75 191 9.7 EU
10 Azerbaijan 21 46 5 1.3 EU
In [51]:
drinks.head()
Out[51]:
country beer_servings spirit_servings wine_servings total_litres_of_pure_alcohol continent
0 Afghanistan 0 0 0 0.0 AS
1 Albania 89 132 54 4.9 EU
2 Algeria 25 0 14 0.7 AF
3 Andorra 245 138 312 12.4 EU
4 Angola 217 57 45 5.9 AF
In [52]:
drinks['total_servings']=drinks['beer_servings']+ drinks['wine_servings']+ drinks['spirit_servings']
In [53]:
drinks['alcohol_rate']= drinks['total_litres_of_pure_alcohol'] / drinks['total_servings']

drinks['alcohol_rate']= drinks['alcohol_rate'].fillna(0)
In [54]:
drinks.head()
Out[54]:
country beer_servings spirit_servings wine_servings total_litres_of_pure_alcohol continent total_servings alcohol_rate
0 Afghanistan 0 0 0 0.0 AS 0 0.000000
1 Albania 89 132 54 4.9 EU 275 0.017818
2 Algeria 25 0 14 0.7 AF 39 0.017949
3 Andorra 245 138 312 12.4 EU 695 0.017842
4 Angola 217 57 45 5.9 AF 319 0.018495
In [55]:
country_rank= drinks[['country','alcohol_rate']]
country_rank= country_rank.sort_values(by=['alcohol_rate'], ascending= 0)
country_rank.head()
Out[55]:
country alcohol_rate
63 Gambia 0.266667
153 Sierra Leone 0.223333
124 Nigeria 0.185714
179 Uganda 0.153704
142 Rwanda 0.151111
In [56]:
country_list = country_rank.country.tolist()
x_pos = np.arange(len(country_list))
rank = country_rank.alcohol_rate.tolist()
 
bar_list = plt.bar(x_pos, rank)
bar_list[country_list.index("South Korea")].set_color('r')
plt.ylabel('alcohol rate')
plt.title('liquor drink rank by contry')
plt.axis([0, 200, 0, 0.3])

korea_rank = country_list.index("South Korea")
korea_alc_rate = country_rank[country_rank['country'] == 'South Korea']['alcohol_rate'].values[0]
plt.annotate('South Korea : ' + str(korea_rank + 1), 
             xy=(korea_rank, korea_alc_rate), 
             xytext=(korea_rank + 10, korea_alc_rate + 0.05),
             arrowprops=dict(facecolor='red', shrink=0.05))

plt.show()

total_litres_of_pure_alcohol 평균을 구하기

이 평균값보다 적은 알코올을 섭취하는 대륙중에서 spirit을 가장 많이 마시는 국가를 구해보자

In [57]:
total_mean=drinks.total_litres_of_pure_alcohol.mean()
total_mean
Out[57]:
4.717098445595855
In [58]:
continent_sum=drinks.groupby('continent').spirit_servings.agg(['sum'])
continent_sum
Out[58]:
sum
continent
AF 866
AS 2677
EU 5965
OC 935
OT 3812
SA 1377
In [59]:
continent_sum['mean']=drinks.groupby('continent')['total_litres_of_pure_alcohol'].mean()
continent_sum
Out[59]:
sum mean
continent
AF 866 3.007547
AS 2677 2.170455
EU 5965 8.617778
OC 935 3.381250
OT 3812 5.995652
SA 1377 6.308333
In [60]:
continent_sum[continent_mean<total_mean]
Out[60]:
sum mean
continent
AF 866 3.007547
AS 2677 2.170455
OC 935 3.381250
In [61]:
continent_sum[continent_mean<total_mean].loc[:,'sum'].idxmax()
Out[61]:
'AS'

1)

In [62]:
a= drinks['continent'].str.contains('AS|AF|OC')
print(a)
0       True
1      False
2       True
3      False
4       True
       ...  
188    False
189     True
190     True
191     True
192     True
Name: continent, Length: 193, dtype: bool
In [63]:
b = drinks[a]
print(b)
country  beer_servings  spirit_servings  wine_servings  \
0    Afghanistan              0                0              0   
2        Algeria             25                0             14   
4         Angola            217               57             45   
8      Australia            261               72            212   
12       Bahrain             42               63              7   
..           ...            ...              ...            ...   
187      Vanuatu             21               18             11   
189      Vietnam            111                2              1   
190        Yemen              6                0              0   
191       Zambia             32               19              4   
192     Zimbabwe             64               18              4   

     total_litres_of_pure_alcohol continent  total_servings  alcohol_rate  
0                             0.0        AS               0      0.000000  
2                             0.7        AF              39      0.017949  
4                             5.9        AF             319      0.018495  
8                            10.4        OC             545      0.019083  
12                            2.0        AS             112      0.017857  
..                            ...       ...             ...           ...  
187                           0.9        OC              50      0.018000  
189                           2.0        AS             114      0.017544  
190                           0.1        AS               6      0.016667  
191                           2.5        AF              55      0.045455  
192                           4.7        AF              86      0.054651  

[113 rows x 8 columns]
In [64]:
spirit_continent_max = b[b['spirit_servings'] == b['spirit_servings'].max()]
spirit_continent_max
Out[64]:
country beer_servings spirit_servings wine_servings total_litres_of_pure_alcohol continent total_servings alcohol_rate
141 Russian Federation 247 326 73 11.5 AS 646 0.017802

2)

In [65]:
a = drinks[drinks['continent'].isin(['AS', 'AF', 'OC'])]
a
Out[65]:
country beer_servings spirit_servings wine_servings total_litres_of_pure_alcohol continent total_servings alcohol_rate
0 Afghanistan 0 0 0 0.0 AS 0 0.000000
2 Algeria 25 0 14 0.7 AF 39 0.017949
4 Angola 217 57 45 5.9 AF 319 0.018495
8 Australia 261 72 212 10.4 OC 545 0.019083
12 Bahrain 42 63 7 2.0 AS 112 0.017857
... ... ... ... ... ... ... ... ...
187 Vanuatu 21 18 11 0.9 OC 50 0.018000
189 Vietnam 111 2 1 2.0 AS 114 0.017544
190 Yemen 6 0 0 0.1 AS 6 0.016667
191 Zambia 32 19 4 2.5 AF 55 0.045455
192 Zimbabwe 64 18 4 4.7 AF 86 0.054651

113 rows × 8 columns

In [66]:
spirit_continent_max = a[a['spirit_servings'] == a['spirit_servings'].max()]
spirit_continent_max
Out[66]:
country beer_servings spirit_servings wine_servings total_litres_of_pure_alcohol continent total_servings alcohol_rate
141 Russian Federation 247 326 73 11.5 AS 646 0.017802
In [67]:
drinks
Out[67]:
country beer_servings spirit_servings wine_servings total_litres_of_pure_alcohol continent total_servings alcohol_rate
0 Afghanistan 0 0 0 0.0 AS 0 0.000000
1 Albania 89 132 54 4.9 EU 275 0.017818
2 Algeria 25 0 14 0.7 AF 39 0.017949
3 Andorra 245 138 312 12.4 EU 695 0.017842
4 Angola 217 57 45 5.9 AF 319 0.018495
... ... ... ... ... ... ... ... ...
188 Venezuela 333 100 3 7.7 SA 436 0.017661
189 Vietnam 111 2 1 2.0 AS 114 0.017544
190 Yemen 6 0 0 0.1 AS 6 0.016667
191 Zambia 32 19 4 2.5 AF 55 0.045455
192 Zimbabwe 64 18 4 4.7 AF 86 0.054651

193 rows × 8 columns

total_litres_of_pure_alcohol 평균을 구하기

이 평균값보다 적은 알코올을 섭취하는 대륙중에서 spirit을 가장 많이 마시는 국가를 구해보자

In [71]:
drinks
Out[71]:
country beer_servings spirit_servings wine_servings total_litres_of_pure_alcohol continent total_servings alcohol_rate
0 Afghanistan 0 0 0 0.0 AS 0 0.000000
1 Albania 89 132 54 4.9 EU 275 0.017818
2 Algeria 25 0 14 0.7 AF 39 0.017949
3 Andorra 245 138 312 12.4 EU 695 0.017842
4 Angola 217 57 45 5.9 AF 319 0.018495
... ... ... ... ... ... ... ... ...
188 Venezuela 333 100 3 7.7 SA 436 0.017661
189 Vietnam 111 2 1 2.0 AS 114 0.017544
190 Yemen 6 0 0 0.1 AS 6 0.016667
191 Zambia 32 19 4 2.5 AF 55 0.045455
192 Zimbabwe 64 18 4 4.7 AF 86 0.054651

193 rows × 8 columns

In [77]:
total_mean=drinks.total_litres_of_pure_alcohol.mean()
total_mean
Out[77]:
4.717098445595855
In [78]:
continent_mean=drinks.groupby('continent')['total_litres_of_pure_alcohol'].mean()
continent_mean
Out[78]:
continent
AF    3.007547
AS    2.170455
EU    8.617778
OC    3.381250
OT    5.995652
SA    6.308333
Name: total_litres_of_pure_alcohol, dtype: float64
In [89]:
 continent_under_mean= continent_mean[continent_mean <= total_mean].index.tolist()
 continent_under_mean
Out[89]:
['AF', 'AS', 'OC']

A[A.column_name.isin(B)]

  • A데이터 프레임에서 A column_name 피처가 B안에 포함되어 있는 데이터만 가져옴
In [90]:
df_continent_under_mean= drinks.loc[drinks.continent.isin(continent_under_mean)] 
df_continent_under_mean
Out[90]:
country beer_servings spirit_servings wine_servings total_litres_of_pure_alcohol continent total_servings alcohol_rate
0 Afghanistan 0 0 0 0.0 AS 0 0.000000
2 Algeria 25 0 14 0.7 AF 39 0.017949
4 Angola 217 57 45 5.9 AF 319 0.018495
8 Australia 261 72 212 10.4 OC 545 0.019083
12 Bahrain 42 63 7 2.0 AS 112 0.017857
... ... ... ... ... ... ... ... ...
187 Vanuatu 21 18 11 0.9 OC 50 0.018000
189 Vietnam 111 2 1 2.0 AS 114 0.017544
190 Yemen 6 0 0 0.1 AS 6 0.016667
191 Zambia 32 19 4 2.5 AF 55 0.045455
192 Zimbabwe 64 18 4 4.7 AF 86 0.054651

113 rows × 8 columns

In [91]:
most_spirit_under_mean= df_continent_under_mean.loc[df_continent_under_mean['spirit_servings'].idxmax()]
most_spirit_under_mean
Out[91]:
country                         Russian Federation
beer_servings                                  247
spirit_servings                                326
wine_servings                                   73
total_litres_of_pure_alcohol                  11.5
continent                                       AS
total_servings                                 646
alcohol_rate                             0.0178019
Name: 141, dtype: object
python_example
  • 10살 단위로 인구를 정리한다.
  • 70대 이상은 하나로 합친다.
  • 3개의 기간동안 인구가 증가하는 곳을 찾는다.
  • 남성이 여성보다 많이 거주하는 곳 가운데 인구가 3만 이상인 곳을 찾는다. (없으면 없다)
In [85]:
import pandas as pd
import numpy as np

2018.06.30.기준 대구광역시 주민등록인구 현황

In [86]:
population_01 = pd.read_csv('data/2018.06.30.기준 대구광역시 주민등록인구 현황_UTF8.csv')
population_01
Out[86]:
구분 총계 총계 남 총계 여 중구 계 중구 남 중구 여 동구 계 동구 남 동구 여 ... 북구 여 수성구 계 수성구 남 수성구 여 달서구 계 달서구 남 달서구 여 달성군 계 달성군 남 달성군 여
0 0세 14568 7488 7080 511 275 236 2263 1161 1102 ... 1356 1784 911 873 3215 1719 1496 2724 1374 1350
1 1세 17475 8947 8528 609 309 300 2755 1410 1345 ... 1670 2264 1170 1094 3818 2017 1801 3063 1543 1520
2 2세 19562 9985 9577 612 308 304 3000 1467 1533 ... 1847 2684 1410 1274 4423 2317 2106 3327 1668 1659
3 3세 20123 10249 9874 648 315 333 3146 1656 1490 ... 1856 2876 1423 1453 4661 2366 2295 3253 1638 1615
4 4세 19794 10069 9725 556 287 269 2971 1519 1452 ... 1846 3089 1596 1493 4529 2294 2235 3036 1512 1524
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
96 96세 365 75 290 23 3 20 66 10 56 ... 37 73 15 58 64 12 52 31 9 22
97 97세 235 45 190 18 3 15 35 13 22 ... 36 43 7 36 39 6 33 16 3 13
98 98세 190 32 158 16 7 9 33 6 27 ... 30 29 4 25 25 6 19 15 0 15
99 99세 112 26 86 6 1 5 25 7 18 ... 13 17 4 13 19 2 17 8 2 6
100 100세 이상 614 136 478 88 15 73 106 23 83 ... 52 97 24 73 68 13 55 26 8 18

101 rows × 28 columns

In [87]:
df =population_01.copy()
In [88]:
drop_list = []
check_list = ['총계', '구분', ' 남', ' 여'] # 남구 삭제 방지를 위해 '남' 앞에 공백 추가 
for chk in check_list:
    for item in df.columns :
        if  chk in item:
            drop_list.append(item)
drop_list = list(set(drop_list)) #  중복 제거를 위해 set을 사용
In [89]:
df1 = df.drop(drop_list,axis=1)
df1
Out[89]:
중구 계 동구 계 서구 계 남구 계 북구 계 수성구 계 달서구 계 달성군 계
0 511 2263 719 586 2766 1784 3215 2724
1 609 2755 887 718 3361 2264 3818 3063
2 612 3000 1010 776 3730 2684 4423 3327
3 648 3146 949 758 3832 2876 4661 3253
4 556 2971 1014 820 3779 3089 4529 3036
... ... ... ... ... ... ... ... ...
96 23 66 30 29 49 73 64 31
97 18 35 18 24 42 43 39 16
98 16 33 15 23 34 29 25 15
99 6 25 10 11 16 17 19 8
100 88 106 89 72 68 97 68 26

101 rows × 8 columns

In [90]:
df1['인구0'] = (pd.DataFrame(range(0,101))/10).astype(int)*10
df1
Out[90]:
중구 계 동구 계 서구 계 남구 계 북구 계 수성구 계 달서구 계 달성군 계 인구0
0 511 2263 719 586 2766 1784 3215 2724 0
1 609 2755 887 718 3361 2264 3818 3063 0
2 612 3000 1010 776 3730 2684 4423 3327 0
3 648 3146 949 758 3832 2876 4661 3253 0
4 556 2971 1014 820 3779 3089 4529 3036 0
... ... ... ... ... ... ... ... ... ...
96 23 66 30 29 49 73 64 31 90
97 18 35 18 24 42 43 39 16 90
98 16 33 15 23 34 29 25 15 90
99 6 25 10 11 16 17 19 8 90
100 88 106 89 72 68 97 68 26 100

101 rows × 9 columns

In [91]:
df1['인구0'] = (pd.DataFrame(range(0,101))/10).astype(int)*10
df1 = df1.groupby('인구0')
df1 = df1.sum()
df1
Out[91]:
중구 계 동구 계 서구 계 남구 계 북구 계 수성구 계 달서구 계 달성군 계
인구0
0 5674 29075 9719 7797 37401 32508 46276 29751
10 5549 29903 14006 11162 48985 57880 63987 23382
20 11300 43608 25542 20608 61021 58097 82987 29853
30 11396 48971 21529 18912 57670 46528 72962 43404
40 11358 54564 27671 22502 77961 79395 98641 40726
50 12107 59064 38473 26615 75014 74095 104487 38816
60 10243 46790 29106 22642 45549 46530 61842 23984
70 7385 27835 16212 14612 25635 26830 30320 12057
80 2997 10725 5702 6239 9784 12104 12259 5235
90 433 1251 656 729 1054 1404 1291 636
100 88 106 89 72 68 97 68 26
In [92]:
df1['인구'] = df1.index
df1['인구'] = np.where(df1['인구'] >= 70, 70, df1.인구)
df1 = df1.groupby('인구')
df1 = df1.sum()
df1
Out[92]:
중구 계 동구 계 서구 계 남구 계 북구 계 수성구 계 달서구 계 달성군 계
인구
0 5674 29075 9719 7797 37401 32508 46276 29751
10 5549 29903 14006 11162 48985 57880 63987 23382
20 11300 43608 25542 20608 61021 58097 82987 29853
30 11396 48971 21529 18912 57670 46528 72962 43404
40 11358 54564 27671 22502 77961 79395 98641 40726
50 12107 59064 38473 26615 75014 74095 104487 38816
60 10243 46790 29106 22642 45549 46530 61842 23984
70 10903 39917 22659 21652 36541 40435 43938 17954
In [93]:
#df1['인구'] = (pd.DataFrame(range(0,101))/10).astype(int)*10
#df1['인구'] = np.where(df1['인구'] >= 70, 70, df1.인구)
#df1 = df1.groupby('인구')
#df1 = df1.sum()
#df1

2018.12.31.기준 대구광역시 주민등록인구 현황

In [94]:
population_02 = pd.read_csv('data/2018.12.31.기준 대구광역시 주민등록인구 현황_UTF8.csv')
population_02.head()
Out[94]:
구분 총계 총계 남 총계 여 중구 계 중구 남 중구 여 동구 계 동구 남 동구 여 ... 북구 여 수성구 계 수성구 남 수성구 여 달서구 계 달서구 남 달서구 여 달성군 계 달성군 남 달성군 여
0 0세 13993 7075 6918 521 272 249 2173 1100 1073 ... 1318 1685 874 811 2954 1483 1471 2735 1362 1373
1 1세 16306 8442 7864 548 278 270 2569 1365 1204 ... 1550 2097 1060 1037 3627 1959 1668 2968 1521 1447
2 2세 18774 9576 9198 656 325 331 2875 1433 1442 ... 1791 2484 1313 1171 4160 2185 1975 3282 1624 1658
3 3세 20010 10252 9758 639 324 315 3055 1592 1463 ... 1863 2858 1477 1381 4623 2363 2260 3264 1629 1635
4 4세 20020 10219 9801 594 310 284 3055 1541 1514 ... 1838 3106 1592 1514 4571 2334 2237 3208 1622 1586

5 rows × 28 columns

In [95]:
df2 =population_02.copy()
In [96]:
drop_list = []
check_list = ['총계', '구분', ' 남', ' 여'] # 남구 삭제 방지를 위해 '남' 앞에 공백 추가 
for chk in check_list:
    for item in df2.columns :
        if  chk in item:
            drop_list.append(item)
drop_list = list(set(drop_list)) #  중복 제거를 위해 set을 사용
df2_1 = df2.drop(drop_list,axis=1)
df2_1['인구'] = (pd.DataFrame(range(0,101))/10).astype(int)*10
df2_1['인구'] = np.where(df2_1['인구'] >= 70, 70, df2_1.인구)
df2_1 = df2_1.groupby('인구')
df2_1 = df2_1.sum()
df2_1
Out[96]:
중구 계 동구 계 서구 계 남구 계 북구 계 수성구 계 달서구 계 달성군 계
인구
0 5744 28571 9287 7520 36774 31851 45262 29944
10 5583 29313 13294 10849 48006 56785 62415 23427
20 11670 43532 24698 20423 60735 57599 82364 29824
30 11653 48399 20686 18483 57192 45823 72346 43396
40 11368 53666 26316 21908 76298 77586 96358 40770
50 12107 59146 37819 26357 75980 74581 105563 39590
60 10215 47617 29113 22849 46874 47295 63772 25015
70 11061 41047 23159 22112 37630 41239 45333 18577

2019.06.30.기준 대구광역시 주민등록인구 현황

In [97]:
population_03 = pd.read_csv('data/2019.06.30.기준 대구광역시 주민등록인구 현황_UTF8.csv',thousands=',')
population_03.head()
Out[97]:
행정구역 총계 총계 남 총계 여 중구 계 중구 남 중구 여 동구 계 동구 남 동구 여 ... 북구 여 수성구 계 수성구 남 수성구 여 달서구 계 달서구 남 달서구 여 달성군 계 달성군 남 달성군 여
0 0세 13085 6754 6331 456 228 228 2019 1021 998 ... 1221 1565 839 726 2771 1413 1358 2660 1358 1302
1 1세 15384 7854 7530 524 273 251 2401 1235 1166 ... 1434 1964 986 978 3370 1780 1590 2885 1429 1456
2 2세 17580 9026 8554 588 293 295 2718 1429 1289 ... 1682 2387 1217 1170 3836 2028 1808 3138 1579 1559
3 3세 19659 10028 9631 625 325 300 2947 1442 1505 ... 1848 2839 1501 1338 4480 2313 2167 3362 1701 1661
4 4세 20230 10294 9936 628 297 331 3103 1620 1483 ... 1858 3069 1536 1533 4710 2388 2322 3260 1641 1619

5 rows × 28 columns

In [98]:
df3 =population_03.copy()
In [99]:
drop_list = []
check_list = ['총계', '행정구역', ' 남', ' 여'] # 남구 삭제 방지를 위해 '남' 앞에 공백 추가 
for chk in check_list:
    for item in df3.columns :
        if  chk in item:
            drop_list.append(item)
drop_list = list(set(drop_list)) #  중복 제거를 위해 set을 사용

df3_1 = df3.drop(drop_list,axis=1)
df3_1['인구'] = (pd.DataFrame(range(0,101))/10).astype(int)*10
df3_1['인구'] = np.where(df3_1['인구'] >= 70, 70, df3_1.인구)
df3_1 = df3_1.groupby('인구')
df3_1 = df3_1.sum()
df3_1
Out[99]:
중구 계 동구 계 서구 계 남구 계 북구 계 수성구 계 달서구 계 달성군 계
인구
0 5572 27937 8765 7221 36116 31376 44236 30293
10 5370 28629 12665 10462 46834 55090 60556 23621
20 11620 42833 23711 20327 60691 56987 81862 29765
30 11311 47415 19635 17871 56384 45226 71171 43412
40 11108 52960 25199 21400 75095 76047 94565 41490
50 11798 58640 36882 26010 76729 74962 105716 40356
60 10069 48272 29378 22886 48297 48484 66056 26081
70 11087 42139 23685 22505 38947 42309 47141 19221

3개의 기간동안 인구가 증가하는 곳을 찾는다

In [100]:
df1 = df1.T
df1['총합'] = df1.sum(axis=1).astype(int)
df1
Out[100]:
인구 0 10 20 30 40 50 60 70 총합
중구 계 5674 5549 11300 11396 11358 12107 10243 10903 78530
동구 계 29075 29903 43608 48971 54564 59064 46790 39917 351892
서구 계 9719 14006 25542 21529 27671 38473 29106 22659 188705
남구 계 7797 11162 20608 18912 22502 26615 22642 21652 151890
북구 계 37401 48985 61021 57670 77961 75014 45549 36541 440142
수성구 계 32508 57880 58097 46528 79395 74095 46530 40435 435468
달서구 계 46276 63987 82987 72962 98641 104487 61842 43938 575120
달성군 계 29751 23382 29853 43404 40726 38816 23984 17954 247870
In [101]:
df2_1 = df2_1.T
df2_1['총합'] = df2_1.sum(axis=1).astype(int)
df2_1
Out[101]:
인구 0 10 20 30 40 50 60 70 총합
중구 계 5744 5583 11670 11653 11368 12107 10215 11061 79401
동구 계 28571 29313 43532 48399 53666 59146 47617 41047 351291
서구 계 9287 13294 24698 20686 26316 37819 29113 23159 184372
남구 계 7520 10849 20423 18483 21908 26357 22849 22112 150501
북구 계 36774 48006 60735 57192 76298 75980 46874 37630 439489
수성구 계 31851 56785 57599 45823 77586 74581 47295 41239 432759
달서구 계 45262 62415 82364 72346 96358 105563 63772 45333 573413
달성군 계 29944 23427 29824 43396 40770 39590 25015 18577 250543
In [102]:
df3_1 = df3_1.T
df3_1['총합'] = df3_1.sum(axis=1).astype(int)
df3_1
Out[102]:
인구 0 10 20 30 40 50 60 70 총합
중구 계 5572 5370 11620 11311 11108 11798 10069 11087 77935
동구 계 27937 28629 42833 47415 52960 58640 48272 42139 348825
서구 계 8765 12665 23711 19635 25199 36882 29378 23685 179920
남구 계 7221 10462 20327 17871 21400 26010 22886 22505 148682
북구 계 36116 46834 60691 56384 75095 76729 48297 38947 439093
수성구 계 31376 55090 56987 45226 76047 74962 48484 42309 430481
달서구 계 44236 60556 81862 71171 94565 105716 66056 47141 571303
달성군 계 30293 23621 29765 43412 41490 40356 26081 19221 254239
In [103]:
pop1 = (df2_1['총합'] - df1['총합']) > 0
pop2 = (df3_1['총합'] - df2_1['총합']) > 0
df3_1['인구증가'] = pop1 & pop2
df3_1
Out[103]:
인구 0 10 20 30 40 50 60 70 총합 인구증가
중구 계 5572 5370 11620 11311 11108 11798 10069 11087 77935 False
동구 계 27937 28629 42833 47415 52960 58640 48272 42139 348825 False
서구 계 8765 12665 23711 19635 25199 36882 29378 23685 179920 False
남구 계 7221 10462 20327 17871 21400 26010 22886 22505 148682 False
북구 계 36116 46834 60691 56384 75095 76729 48297 38947 439093 False
수성구 계 31376 55090 56987 45226 76047 74962 48484 42309 430481 False
달서구 계 44236 60556 81862 71171 94565 105716 66056 47141 571303 False
달성군 계 30293 23621 29765 43412 41490 40356 26081 19221 254239 True
In [104]:
df3_1[df3_1.인구증가 == True]
Out[104]:
인구 0 10 20 30 40 50 60 70 총합 인구증가
달성군 계 30293 23621 29765 43412 41490 40356 26081 19221 254239 True

4. 다음조건 찾기

  • 남성인구 > 여성인구
  • 인구수 > 20만
In [105]:
df = population_01.copy()
In [106]:
#공통제거
drop_list = []
check_list = ['총계', '구분',]
for chk in check_list:
    for item in df.columns :
        if  chk in item:
            drop_list.append(item)
drop_list = list(set(drop_list)) #  중복 제거를 위해 set을 사용
In [107]:
df = df.drop(drop_list, axis=1)
In [108]:
df['인구'] = (pd.DataFrame(range(0,101))/10).astype(int)*10
df['인구'] = np.where(df['인구'] >= 70, 70, df.인구)
df = df.groupby('인구')
df = df.sum()
df = df.T
df['총합'] = df.sum(axis='columns').astype(int)
df = df.T
df
Out[108]:
중구 계 중구 남 중구 여 동구 계 동구 남 동구 여 서구 계 서구 남 서구 여 남구 계 ... 북구 여 수성구 계 수성구 남 수성구 여 달서구 계 달서구 남 달서구 여 달성군 계 달성군 남 달성군 여
인구
0 5674 2952 2722 29075 14987 14088 9719 4936 4783 7797 ... 18260 32508 16713 15795 46276 23865 22411 29751 15132 14619
10 5549 2801 2748 29903 15815 14088 14006 7406 6600 11162 ... 23284 57880 30792 27088 63987 33506 30481 23382 12302 11080
20 11300 5611 5689 43608 23707 19901 25542 14240 11302 20608 ... 27737 58097 31464 26633 82987 45010 37977 29853 16533 13320
30 11396 5877 5519 48971 25221 23750 21529 11920 9609 18912 ... 28127 46528 22290 24238 72962 37075 35887 43404 22386 21018
40 11358 5868 5490 54564 28261 26303 27671 14669 13002 22502 ... 39635 79395 36264 43131 98641 47547 51094 40726 21246 19480
50 12107 6000 6107 59064 28461 30603 38473 19174 19299 26615 ... 37602 74095 36270 37825 104487 50800 53687 38816 19554 19262
60 10243 4642 5601 46790 21842 24948 29106 13749 15357 22642 ... 23545 46530 21938 24592 61842 30114 31728 23984 11985 11999
70 10903 4343 6560 39917 16048 23869 22659 9023 13636 21652 ... 22217 40435 16218 24217 43938 17326 26612 17954 7004 10950
총합 78530 38094 40436 351892 174342 177550 188705 95117 93588 151890 ... 220407 435468 211949 223519 575120 285243 289877 247870 126142 121728

9 rows × 24 columns

In [109]:
#남자만 뽑기
drop_list = []
check_list = [' 계', ' 여']
for chk in check_list:
    for item in df.columns :
        if  chk in item:
            drop_list.append(item)
drop_list = list(set(drop_list)) #  중복 제거를 위해 set을 사용
#drop_list
In [110]:
ex4_df1_M = df.drop(drop_list, axis=1)
ex4_df1_M = ex4_df1_M.T
ex4_df1_M
Out[110]:
인구 0 10 20 30 40 50 60 70 총합
중구 남 2952 2801 5611 5877 5868 6000 4642 4343 38094
동구 남 14987 15815 23707 25221 28261 28461 21842 16048 174342
서구 남 4936 7406 14240 11920 14669 19174 13749 9023 95117
남구 남 3986 5829 10837 9790 11423 12691 10382 8566 73504
북구 남 19141 25701 33284 29543 38326 37412 22004 14324 219735
수성구 남 16713 30792 31464 22290 36264 36270 21938 16218 211949
달서구 남 23865 33506 45010 37075 47547 50800 30114 17326 285243
달성군 남 15132 12302 16533 22386 21246 19554 11985 7004 126142
In [111]:
#여자만 뽑기
drop_list = []
check_list = [' 계', ' 남']
for chk in check_list:
    for item in df.columns :
        if  chk in item:
            drop_list.append(item)
drop_list = list(set(drop_list)) #  중복 제거를 위해 set을 사용
#drop_list
In [112]:
ex4_df1_F = df.drop(drop_list, axis=1)
ex4_df1_F = ex4_df1_F.T
ex4_df1_F 
Out[112]:
인구 0 10 20 30 40 50 60 70 총합
중구 여 2722 2748 5689 5519 5490 6107 5601 6560 40436
동구 여 14088 14088 19901 23750 26303 30603 24948 23869 177550
서구 여 4783 6600 11302 9609 13002 19299 15357 13636 93588
남구 여 3811 5333 9771 9122 11079 13924 12260 13086 78386
북구 여 18260 23284 27737 28127 39635 37602 23545 22217 220407
수성구 여 15795 27088 26633 24238 43131 37825 24592 24217 223519
달서구 여 22411 30481 37977 35887 51094 53687 31728 26612 289877
달성군 여 14619 11080 13320 21018 19480 19262 11999 10950 121728
In [113]:
#합계만 뽑기
drop_list = []
check_list = [' 남', ' 여']
for chk in check_list:
    for item in df.columns :
        if  chk in item:
            drop_list.append(item)
drop_list = list(set(drop_list)) #  중복 제거를 위해 set을 사용
#drop_list
In [114]:
ex4_df1_T = df.drop(drop_list, axis=1)
ex4_df1_T = ex4_df1_T.T
ex4_df1_T
Out[114]:
인구 0 10 20 30 40 50 60 70 총합
중구 계 5674 5549 11300 11396 11358 12107 10243 10903 78530
동구 계 29075 29903 43608 48971 54564 59064 46790 39917 351892
서구 계 9719 14006 25542 21529 27671 38473 29106 22659 188705
남구 계 7797 11162 20608 18912 22502 26615 22642 21652 151890
북구 계 37401 48985 61021 57670 77961 75014 45549 36541 440142
수성구 계 32508 57880 58097 46528 79395 74095 46530 40435 435468
달서구 계 46276 63987 82987 72962 98641 104487 61842 43938 575120
달성군 계 29751 23382 29853 43404 40726 38816 23984 17954 247870
In [115]:
ex4_df1_T['남초여부'] = (ex4_df1_M['총합'].values > ex4_df1_F['총합'].values) 
# result = (ex4_df1_M['총합'].values > ex4_df1_F['총합'].values) > 0
# index = ex4_df1_T.index
# obj = pd.Series(result, index=index)
# ex4_df1_T['남초여부'] = obj
ex4_df1_T
Out[115]:
인구 0 10 20 30 40 50 60 70 총합 남초여부
중구 계 5674 5549 11300 11396 11358 12107 10243 10903 78530 False
동구 계 29075 29903 43608 48971 54564 59064 46790 39917 351892 False
서구 계 9719 14006 25542 21529 27671 38473 29106 22659 188705 True
남구 계 7797 11162 20608 18912 22502 26615 22642 21652 151890 False
북구 계 37401 48985 61021 57670 77961 75014 45549 36541 440142 False
수성구 계 32508 57880 58097 46528 79395 74095 46530 40435 435468 False
달서구 계 46276 63987 82987 72962 98641 104487 61842 43938 575120 False
달성군 계 29751 23382 29853 43404 40726 38816 23984 17954 247870 True
In [116]:
case1 = ex4_df1_T['남초여부'] == True 
case2 = ex4_df1_T['총합']> 200000
case = case1 & case2
ex4_df1_T['결과'] = case
ex4_df1_T
Out[116]:
인구 0 10 20 30 40 50 60 70 총합 남초여부 결과
중구 계 5674 5549 11300 11396 11358 12107 10243 10903 78530 False False
동구 계 29075 29903 43608 48971 54564 59064 46790 39917 351892 False False
서구 계 9719 14006 25542 21529 27671 38473 29106 22659 188705 True False
남구 계 7797 11162 20608 18912 22502 26615 22642 21652 151890 False False
북구 계 37401 48985 61021 57670 77961 75014 45549 36541 440142 False False
수성구 계 32508 57880 58097 46528 79395 74095 46530 40435 435468 False False
달서구 계 46276 63987 82987 72962 98641 104487 61842 43938 575120 False False
달성군 계 29751 23382 29853 43404 40726 38816 23984 17954 247870 True True
In [117]:
ex4_df1_T[ex4_df1_T['결과'] == True]
Out[117]:
인구 0 10 20 30 40 50 60 70 총합 남초여부 결과
달성군 계 29751 23382 29853 43404 40726 38816 23984 17954 247870 True True
In [118]:
ex4_df1_T = ex4_df1_T.T
ex4_df1_T
Out[118]:
중구 계 동구 계 서구 계 남구 계 북구 계 수성구 계 달서구 계 달성군 계
인구
0 5674 29075 9719 7797 37401 32508 46276 29751
10 5549 29903 14006 11162 48985 57880 63987 23382
20 11300 43608 25542 20608 61021 58097 82987 29853
30 11396 48971 21529 18912 57670 46528 72962 43404
40 11358 54564 27671 22502 77961 79395 98641 40726
50 12107 59064 38473 26615 75014 74095 104487 38816
60 10243 46790 29106 22642 45549 46530 61842 23984
70 10903 39917 22659 21652 36541 40435 43938 17954
총합 78530 351892 188705 151890 440142 435468 575120 247870
남초여부 False False True False False False False True
결과 False False False False False False False True

컬럼 이름 변경

  1. 새로운 리스트로 덮어씀
In [119]:
ex4_df1_T.columns = ['중구','동구','서구','남구','북구','수성구','달서구','달성군']
ex4_df1_T
Out[119]:
중구 동구 서구 남구 북구 수성구 달서구 달성군
인구
0 5674 29075 9719 7797 37401 32508 46276 29751
10 5549 29903 14006 11162 48985 57880 63987 23382
20 11300 43608 25542 20608 61021 58097 82987 29853
30 11396 48971 21529 18912 57670 46528 72962 43404
40 11358 54564 27671 22502 77961 79395 98641 40726
50 12107 59064 38473 26615 75014 74095 104487 38816
60 10243 46790 29106 22642 45549 46530 61842 23984
70 10903 39917 22659 21652 36541 40435 43938 17954
총합 78530 351892 188705 151890 440142 435468 575120 247870
남초여부 False False True False False False False True
결과 False False False False False False False True
  1. replace를 사용하여 이름 명 변경(대체)
In [120]:
ex4_df1_T.columns = ex4_df1_T.columns.str.replace("구","구 계")
ex4_df1_T
Out[120]:
중구 계 동구 계 서구 계 남구 계 북구 계 수성구 계 달서구 계 달성군
인구
0 5674 29075 9719 7797 37401 32508 46276 29751
10 5549 29903 14006 11162 48985 57880 63987 23382
20 11300 43608 25542 20608 61021 58097 82987 29853
30 11396 48971 21529 18912 57670 46528 72962 43404
40 11358 54564 27671 22502 77961 79395 98641 40726
50 12107 59064 38473 26615 75014 74095 104487 38816
60 10243 46790 29106 22642 45549 46530 61842 23984
70 10903 39917 22659 21652 36541 40435 43938 17954
총합 78530 351892 188705 151890 440142 435468 575120 247870
남초여부 False False True False False False False True
결과 False False False False False False False True
  1. 각각 이름 변경시 rename을 사용
In [121]:
ex4_df1_T = ex4_df1_T.rename({'중구 계':'대구중구'}, axis='columns')
ex4_df1_T
Out[121]:
대구중구 동구 계 서구 계 남구 계 북구 계 수성구 계 달서구 계 달성군
인구
0 5674 29075 9719 7797 37401 32508 46276 29751
10 5549 29903 14006 11162 48985 57880 63987 23382
20 11300 43608 25542 20608 61021 58097 82987 29853
30 11396 48971 21529 18912 57670 46528 72962 43404
40 11358 54564 27671 22502 77961 79395 98641 40726
50 12107 59064 38473 26615 75014 74095 104487 38816
60 10243 46790 29106 22642 45549 46530 61842 23984
70 10903 39917 22659 21652 36541 40435 43938 17954
총합 78530 351892 188705 151890 440142 435468 575120 247870
남초여부 False False True False False False False True
결과 False False False False False False False True

5. 대구광역시의 각 구별 인구수를 정리하여 표시하고 인구가 가장 많은 지역과 가장 적은 지역을 구하여 출력 하라(3개 파일에서 각각 구하라)

In [232]:
#합계만 뽑기
drop_list = []
check_list = [' 남', ' 여']
for chk in check_list:
    for item in df.columns :
        if  chk in item:
            drop_list.append(item)
drop_list = list(set(drop_list)) #  중복 제거를 위해 set을 사용
#drop_list
In [233]:
df1_T = df.drop(drop_list, axis=1)
df1_T = df1_T.T
df1_T
Out[233]:
인구 0 10 20 30 40 50 60 70 총합
중구 계 5674 5549 11300 11396 11358 12107 10243 10903 78530
동구 계 29075 29903 43608 48971 54564 59064 46790 39917 351892
서구 계 9719 14006 25542 21529 27671 38473 29106 22659 188705
남구 계 7797 11162 20608 18912 22502 26615 22642 21652 151890
북구 계 37401 48985 61021 57670 77961 75014 45549 36541 440142
수성구 계 32508 57880 58097 46528 79395 74095 46530 40435 435468
달서구 계 46276 63987 82987 72962 98641 104487 61842 43938 575120
달성군 계 29751 23382 29853 43404 40726 38816 23984 17954 247870
In [234]:
df1_T1 =df1_T.copy()
In [240]:
max_1 = df1_T1['총합'].idxmax()
df1_T1[df1_T1.index == max_1 ]
Out[240]:
인구 0 10 20 30 40 50 60 70 총합 최대인구 구
달서구 계 46276 63987 82987 72962 98641 104487 61842 43938 575120 달서구 계
In [241]:
min_1 = df1_T1['총합'].idxmin()
df1_T1[df1_T1.index == min_1 ]
Out[241]:
인구 0 10 20 30 40 50 60 70 총합 최대인구 구
중구 계 5674 5549 11300 11396 11358 12107 10243 10903 78530 달서구 계
In [201]:
max_1 = df1_T['총합'].idxmax() == df1_T1.index
min_1 = df1_T['총합'].idxmin() == df1_T1.index
df1_T1['최대인구 구'] = max_1
df1_T1['최소인구 구'] = min_1
df1_T1
Out[201]:
인구 0 10 20 30 40 50 60 70 총합 최대인구 구 최소인구 구
중구 계 5674 5549 11300 11396 11358 12107 10243 10903 78530 False True
동구 계 29075 29903 43608 48971 54564 59064 46790 39917 351892 False False
서구 계 9719 14006 25542 21529 27671 38473 29106 22659 188705 False False
남구 계 7797 11162 20608 18912 22502 26615 22642 21652 151890 False False
북구 계 37401 48985 61021 57670 77961 75014 45549 36541 440142 False False
수성구 계 32508 57880 58097 46528 79395 74095 46530 40435 435468 False False
달서구 계 46276 63987 82987 72962 98641 104487 61842 43938 575120 True False
달성군 계 29751 23382 29853 43404 40726 38816 23984 17954 247870 False False
In [202]:
df2 =population_02.copy()
In [203]:
#공통제거
drop_list = []
check_list = ['총계', '구분',]
for chk in check_list:
    for item in df2.columns :
        if  chk in item:
            drop_list.append(item)
drop_list = list(set(drop_list)) #  중복 제거를 위해 set을 사용
In [204]:
df2 = df2.drop(drop_list, axis=1)
In [205]:
df2['인구'] = (pd.DataFrame(range(0,101))/10).astype(int)*10
df2['인구'] = np.where(df2['인구'] >= 70, 70, df2.인구)
df2 = df2.groupby('인구')
df2 = df2.sum()
df2 = df2.T
df2['총합'] = df2.sum(axis='columns').astype(int)
df2 = df2.T
df2
Out[205]:
중구 계 중구 남 중구 여 동구 계 동구 남 동구 여 서구 계 서구 남 서구 여 남구 계 ... 북구 여 수성구 계 수성구 남 수성구 여 달서구 계 달서구 남 달서구 여 달성군 계 달성군 남 달성군 여
인구
0 5744 2978 2766 28571 14765 13806 9287 4707 4580 7520 ... 17984 31851 16415 15436 45262 23290 21972 29944 15194 14750
10 5583 2815 2768 29313 15439 13874 13294 7028 6266 10849 ... 22866 56785 30245 26540 62415 32564 29851 23427 12319 11108
20 11670 5764 5906 43532 23636 19896 24698 13701 10997 20423 ... 27621 57599 31132 26467 82364 44525 37839 29824 16481 13343
30 11653 6028 5625 48399 25034 23365 20686 11520 9166 18483 ... 27786 45823 21936 23887 72346 36903 35443 43396 22413 20983
40 11368 5873 5495 53666 27768 25898 26316 14011 12305 21908 ... 38825 77586 35471 42115 96358 46516 49842 40770 21276 19494
50 12107 5988 6119 59146 28535 30611 37819 18840 18979 26357 ... 38142 74581 36489 38092 105563 51225 54338 39590 19897 19693
60 10215 4679 5536 47617 22270 25347 29113 13742 15371 22849 ... 24122 47295 22356 24939 63772 31093 32679 25015 12497 12518
70 11061 4373 6688 41047 16508 24539 23159 9247 13912 22112 ... 22836 41239 16577 24662 45333 18011 27322 18577 7297 11280
총합 79401 38498 40903 351291 173955 177336 184372 92796 91576 150501 ... 220182 432759 210621 222138 573413 284127 289286 250543 127374 123169

9 rows × 24 columns

In [244]:
#합계만 뽑기
drop_list = []
check_list = [' 남', ' 여']
for chk in check_list:
    for item in df2.columns :
        if  chk in item:
            drop_list.append(item)
drop_list = list(set(drop_list)) #  중복 제거를 위해 set을 사용
#drop_list
In [269]:
df2_T = df2.drop(drop_list, axis=1)
df2_T = df2_T.T
df2_T
Out[269]:
인구 0 10 20 30 40 50 60 70 총합
중구 계 5744 5583 11670 11653 11368 12107 10215 11061 79401
동구 계 28571 29313 43532 48399 53666 59146 47617 41047 351291
서구 계 9287 13294 24698 20686 26316 37819 29113 23159 184372
남구 계 7520 10849 20423 18483 21908 26357 22849 22112 150501
북구 계 36774 48006 60735 57192 76298 75980 46874 37630 439489
수성구 계 31851 56785 57599 45823 77586 74581 47295 41239 432759
달서구 계 45262 62415 82364 72346 96358 105563 63772 45333 573413
달성군 계 29944 23427 29824 43396 40770 39590 25015 18577 250543
In [246]:
df2_T2 =df2_T.copy()
In [247]:
max_2 = df2_T2['총합'].idxmax()
df2_T2[df2_T2.index == max_2 ]
Out[247]:
인구 0 10 20 30 40 50 60 70 총합
달서구 계 45262 62415 82364 72346 96358 105563 63772 45333 573413
In [248]:
min_2 = df2_T2['총합'].idxmin()
df2_T2[df2_T2.index == min_2 ]
  
Out[248]:
인구 0 10 20 30 40 50 60 70 총합
중구 계 5744 5583 11670 11653 11368 12107 10215 11061 79401
In [208]:
max_2 = df2_T['총합'].idxmax() == df2_T2.index
min_2 = df2_T['총합'].idxmin() == df2_T2.index
df2_T2['최대인구 구'] = max_2
df2_T2['최소인구 구'] = min_2
df2_T2
Out[208]:
인구 0 10 20 30 40 50 60 70 총합 최대인구 구 최소인구 구
중구 계 5744 5583 11670 11653 11368 12107 10215 11061 79401 False True
동구 계 28571 29313 43532 48399 53666 59146 47617 41047 351291 False False
서구 계 9287 13294 24698 20686 26316 37819 29113 23159 184372 False False
남구 계 7520 10849 20423 18483 21908 26357 22849 22112 150501 False False
북구 계 36774 48006 60735 57192 76298 75980 46874 37630 439489 False False
수성구 계 31851 56785 57599 45823 77586 74581 47295 41239 432759 False False
달서구 계 45262 62415 82364 72346 96358 105563 63772 45333 573413 True False
달성군 계 29944 23427 29824 43396 40770 39590 25015 18577 250543 False False
In [250]:
df3 = population_03.copy() 
In [251]:
#공통제거
drop_list = []
check_list = ['총계', '구분',]
for chk in check_list:
    for item in df3.columns :
        if  chk in item:
            drop_list.append(item)
drop_list = list(set(drop_list)) #  중복 제거를 위해 set을 사용
In [252]:
df3 = df3.drop(drop_list, axis=1)
In [253]:
df3['인구'] = (pd.DataFrame(range(0,101))/10).astype(int)*10
df3['인구'] = np.where(df3['인구'] >= 70, 70, df3.인구)
df3 = df3.groupby('인구')
df3 = df3.sum()
df3 = df3.T
df3['총합'] = df3.sum(axis='columns').astype(int)
df3 = df3.T
df3
Out[253]:
중구 계 중구 남 중구 여 동구 계 동구 남 동구 여 서구 계 서구 남 서구 여 남구 계 ... 북구 여 수성구 계 수성구 남 수성구 여 달서구 계 달서구 남 달서구 여 달성군 계 달성군 남 달성군 여
인구
0 5572 2855 2717 27937 14401 13536 8765 4443 4322 7221 ... 17605 31376 16144 15232 44236 22726 21510 30293 15404 14889
10 5370 2705 2665 28629 15069 13560 12665 6683 5982 10462 ... 22372 55090 29299 25791 60556 31529 29027 23621 12396 11225
20 11620 5714 5906 42833 23142 19691 23711 13079 10632 20327 ... 27671 56987 30778 26209 81862 44109 37753 29765 16427 13338
30 11311 5836 5475 47415 24603 22812 19635 10977 8658 17871 ... 27225 45226 21812 23414 71171 36515 34656 43412 22487 20925
40 11108 5695 5413 52960 27422 25538 25199 13470 11729 21400 ... 38228 76047 34718 41329 94565 45710 48855 41490 21640 19850
50 11798 5825 5973 58640 28290 30350 36882 18430 18452 26010 ... 38585 74962 36596 38366 105716 51170 54546 40356 20164 20192
60 10069 4649 5420 48272 22488 25784 29378 13856 15522 22886 ... 24784 48484 22900 25584 66056 32130 33926 26081 13063 13018
70 11087 4382 6705 42139 16986 25153 23685 9481 14204 22505 ... 23595 42309 17001 25308 47141 18867 28274 19221 7652 11569
총합 77935 37661 40274 348825 172401 176424 179920 90419 89501 148682 ... 220065 430481 209248 221233 571303 282756 288547 254239 129233 125006

9 rows × 24 columns

In [254]:
drop_list = []
check_list = [' 남', ' 여']
for chk in check_list:
    for item in df3.columns :
        if  chk in item:
            drop_list.append(item)
drop_list = list(set(drop_list)) #  중복 제거를 위해 set을 사용
#drop_list
In [274]:
df3_T = df3.drop(drop_list, axis=1)
df3_T = df3_T.T
df3_T
Out[274]:
인구 0 10 20 30 40 50 60 70 총합
중구 계 5572 5370 11620 11311 11108 11798 10069 11087 77935
동구 계 27937 28629 42833 47415 52960 58640 48272 42139 348825
서구 계 8765 12665 23711 19635 25199 36882 29378 23685 179920
남구 계 7221 10462 20327 17871 21400 26010 22886 22505 148682
북구 계 36116 46834 60691 56384 75095 76729 48297 38947 439093
수성구 계 31376 55090 56987 45226 76047 74962 48484 42309 430481
달서구 계 44236 60556 81862 71171 94565 105716 66056 47141 571303
달성군 계 30293 23621 29765 43412 41490 40356 26081 19221 254239
In [258]:
df3_T3 =df3_T.copy()
In [259]:
max_3 = df3_T['총합'].idxmax()
df3_T3[df3_T3.index == max_3 ]
Out[259]:
인구 0 10 20 30 40 50 60 70 총합
달서구 계 44236 60556 81862 71171 94565 105716 66056 47141 571303
In [260]:
min_3 = df3_T3['총합'].idxmin()
df3_T3[df3_T3.index == min_1 ]
Out[260]:
인구 0 10 20 30 40 50 60 70 총합
중구 계 5572 5370 11620 11311 11108 11798 10069 11087 77935
In [215]:
max_3 = df3_T['총합'].idxmax() == df3_T.index
min_3 = df3_T['총합'].idxmin() == df3_T.index
df3_T['최대인구 구'] = max_3
df3_T['최소인구 구'] = min_3
df3_T
Out[215]:
인구 0 10 20 30 40 50 60 70 총합 최대인구 구 최소인구 구
중구 계 5572 5370 11620 11311 11108 11798 10069 11087 77935 False True
동구 계 27937 28629 42833 47415 52960 58640 48272 42139 348825 False False
서구 계 8765 12665 23711 19635 25199 36882 29378 23685 179920 False False
남구 계 7221 10462 20327 17871 21400 26010 22886 22505 148682 False False
북구 계 36116 46834 60691 56384 75095 76729 48297 38947 439093 False False
수성구 계 31376 55090 56987 45226 76047 74962 48484 42309 430481 False False
달서구 계 44236 60556 81862 71171 94565 105716 66056 47141 571303 True False
달성군 계 30293 23621 29765 43412 41490 40356 26081 19221 254239 False False

6. 대구광역시의 각 구별 20대 대비 60세 이상의 인구 비율을 구하여 출력하고 이 비율이 가장 높은 지역을 구하여 출력하라

In [265]:
df1_T
Out[265]:
인구 0 10 20 30 40 50 60 70 총합
중구 계 5674 5549 11300 11396 11358 12107 10243 10903 78530
동구 계 29075 29903 43608 48971 54564 59064 46790 39917 351892
서구 계 9719 14006 25542 21529 27671 38473 29106 22659 188705
남구 계 7797 11162 20608 18912 22502 26615 22642 21652 151890
북구 계 37401 48985 61021 57670 77961 75014 45549 36541 440142
수성구 계 32508 57880 58097 46528 79395 74095 46530 40435 435468
달서구 계 46276 63987 82987 72962 98641 104487 61842 43938 575120
달성군 계 29751 23382 29853 43404 40726 38816 23984 17954 247870
In [266]:
df1_T['60대이상'] = (df1_T[60] + df1_T[70]).astype(int)
df1_T
Out[266]:
인구 0 10 20 30 40 50 60 70 총합 60대이상
중구 계 5674 5549 11300 11396 11358 12107 10243 10903 78530 21146
동구 계 29075 29903 43608 48971 54564 59064 46790 39917 351892 86707
서구 계 9719 14006 25542 21529 27671 38473 29106 22659 188705 51765
남구 계 7797 11162 20608 18912 22502 26615 22642 21652 151890 44294
북구 계 37401 48985 61021 57670 77961 75014 45549 36541 440142 82090
수성구 계 32508 57880 58097 46528 79395 74095 46530 40435 435468 86965
달서구 계 46276 63987 82987 72962 98641 104487 61842 43938 575120 105780
달성군 계 29751 23382 29853 43404 40726 38816 23984 17954 247870 41938
In [267]:
df1_T['rate'] = round((df1_T['60대이상']/df1_T[20])*100,1)
df1_T
Out[267]:
인구 0 10 20 30 40 50 60 70 총합 60대이상 rate
중구 계 5674 5549 11300 11396 11358 12107 10243 10903 78530 21146 187.1
동구 계 29075 29903 43608 48971 54564 59064 46790 39917 351892 86707 198.8
서구 계 9719 14006 25542 21529 27671 38473 29106 22659 188705 51765 202.7
남구 계 7797 11162 20608 18912 22502 26615 22642 21652 151890 44294 214.9
북구 계 37401 48985 61021 57670 77961 75014 45549 36541 440142 82090 134.5
수성구 계 32508 57880 58097 46528 79395 74095 46530 40435 435468 86965 149.7
달서구 계 46276 63987 82987 72962 98641 104487 61842 43938 575120 105780 127.5
달성군 계 29751 23382 29853 43404 40726 38816 23984 17954 247870 41938 140.5
In [268]:
max_6_1 = df1_T['rate'].idxmax()
df1_T[df1_T.index == max_6_1 ]
Out[268]:
인구 0 10 20 30 40 50 60 70 총합 60대이상 rate
남구 계 7797 11162 20608 18912 22502 26615 22642 21652 151890 44294 214.9
In [270]:
df2_T
Out[270]:
인구 0 10 20 30 40 50 60 70 총합
중구 계 5744 5583 11670 11653 11368 12107 10215 11061 79401
동구 계 28571 29313 43532 48399 53666 59146 47617 41047 351291
서구 계 9287 13294 24698 20686 26316 37819 29113 23159 184372
남구 계 7520 10849 20423 18483 21908 26357 22849 22112 150501
북구 계 36774 48006 60735 57192 76298 75980 46874 37630 439489
수성구 계 31851 56785 57599 45823 77586 74581 47295 41239 432759
달서구 계 45262 62415 82364 72346 96358 105563 63772 45333 573413
달성군 계 29944 23427 29824 43396 40770 39590 25015 18577 250543
In [271]:
df2_T['60대이상'] = (df2_T[60] + df2_T[70]).astype(int)
df2_T
Out[271]:
인구 0 10 20 30 40 50 60 70 총합 60대이상
중구 계 5744 5583 11670 11653 11368 12107 10215 11061 79401 21276
동구 계 28571 29313 43532 48399 53666 59146 47617 41047 351291 88664
서구 계 9287 13294 24698 20686 26316 37819 29113 23159 184372 52272
남구 계 7520 10849 20423 18483 21908 26357 22849 22112 150501 44961
북구 계 36774 48006 60735 57192 76298 75980 46874 37630 439489 84504
수성구 계 31851 56785 57599 45823 77586 74581 47295 41239 432759 88534
달서구 계 45262 62415 82364 72346 96358 105563 63772 45333 573413 109105
달성군 계 29944 23427 29824 43396 40770 39590 25015 18577 250543 43592
In [272]:
df2_T['rate'] = round((df2_T['60대이상']/df2_T[20])*100,1)
df2_T
Out[272]:
인구 0 10 20 30 40 50 60 70 총합 60대이상 rate
중구 계 5744 5583 11670 11653 11368 12107 10215 11061 79401 21276 182.3
동구 계 28571 29313 43532 48399 53666 59146 47617 41047 351291 88664 203.7
서구 계 9287 13294 24698 20686 26316 37819 29113 23159 184372 52272 211.6
남구 계 7520 10849 20423 18483 21908 26357 22849 22112 150501 44961 220.1
북구 계 36774 48006 60735 57192 76298 75980 46874 37630 439489 84504 139.1
수성구 계 31851 56785 57599 45823 77586 74581 47295 41239 432759 88534 153.7
달서구 계 45262 62415 82364 72346 96358 105563 63772 45333 573413 109105 132.5
달성군 계 29944 23427 29824 43396 40770 39590 25015 18577 250543 43592 146.2
In [273]:
max_6_2 = df2_T['rate'].idxmax()
df2_T[df2_T.index == max_6_2 ]
Out[273]:
인구 0 10 20 30 40 50 60 70 총합 60대이상 rate
남구 계 7520 10849 20423 18483 21908 26357 22849 22112 150501 44961 220.1
In [275]:
df3_T
Out[275]:
인구 0 10 20 30 40 50 60 70 총합
중구 계 5572 5370 11620 11311 11108 11798 10069 11087 77935
동구 계 27937 28629 42833 47415 52960 58640 48272 42139 348825
서구 계 8765 12665 23711 19635 25199 36882 29378 23685 179920
남구 계 7221 10462 20327 17871 21400 26010 22886 22505 148682
북구 계 36116 46834 60691 56384 75095 76729 48297 38947 439093
수성구 계 31376 55090 56987 45226 76047 74962 48484 42309 430481
달서구 계 44236 60556 81862 71171 94565 105716 66056 47141 571303
달성군 계 30293 23621 29765 43412 41490 40356 26081 19221 254239
In [276]:
df3_T['60대이상'] = (df3_T[60] + df3_T[70]).astype(int)
df3_T
Out[276]:
인구 0 10 20 30 40 50 60 70 총합 60대이상
중구 계 5572 5370 11620 11311 11108 11798 10069 11087 77935 21156
동구 계 27937 28629 42833 47415 52960 58640 48272 42139 348825 90411
서구 계 8765 12665 23711 19635 25199 36882 29378 23685 179920 53063
남구 계 7221 10462 20327 17871 21400 26010 22886 22505 148682 45391
북구 계 36116 46834 60691 56384 75095 76729 48297 38947 439093 87244
수성구 계 31376 55090 56987 45226 76047 74962 48484 42309 430481 90793
달서구 계 44236 60556 81862 71171 94565 105716 66056 47141 571303 113197
달성군 계 30293 23621 29765 43412 41490 40356 26081 19221 254239 45302
In [277]:
df3_T['rate'] = round((df3_T['60대이상']/df3_T[20])*100,1)
df3_T
Out[277]:
인구 0 10 20 30 40 50 60 70 총합 60대이상 rate
중구 계 5572 5370 11620 11311 11108 11798 10069 11087 77935 21156 182.1
동구 계 27937 28629 42833 47415 52960 58640 48272 42139 348825 90411 211.1
서구 계 8765 12665 23711 19635 25199 36882 29378 23685 179920 53063 223.8
남구 계 7221 10462 20327 17871 21400 26010 22886 22505 148682 45391 223.3
북구 계 36116 46834 60691 56384 75095 76729 48297 38947 439093 87244 143.8
수성구 계 31376 55090 56987 45226 76047 74962 48484 42309 430481 90793 159.3
달서구 계 44236 60556 81862 71171 94565 105716 66056 47141 571303 113197 138.3
달성군 계 30293 23621 29765 43412 41490 40356 26081 19221 254239 45302 152.2
In [278]:
max_6_3 = df3_T['rate'].idxmax()
df3_T[df3_T.index == max_6_3 ]
Out[278]:
인구 0 10 20 30 40 50 60 70 총합 60대이상 rate
서구 계 8765 12665 23711 19635 25199 36882 29378 23685 179920 53063 223.8
Python_09102
In [1]:
import pandas as pd 
In [2]:
df= pd.read_csv('data/titanic_train.csv', sep=',')
In [3]:
df.head()
Out[3]:
pclass survived name sex age sibsp parch ticket fare cabin embarked body home.dest
0 2 1 Mellinger, Miss. Madeleine Violet female 13.0 0 1 250644 19.5000 NaN S NaN England / Bennington, VT
1 2 1 Wells, Miss. Joan female 4.0 1 1 29103 23.0000 NaN S NaN Cornwall / Akron, OH
2 2 1 Duran y More, Miss. Florentina female 30.0 1 0 SC/PARIS 2148 13.8583 NaN C NaN Barcelona, Spain / Havana, Cuba
3 3 0 Scanlan, Mr. James male NaN 0 0 36209 7.7250 NaN Q NaN NaN
4 3 1 Bradley, Miss. Bridget Delia female 22.0 0 0 334914 7.7250 NaN Q NaN Kingwilliamstown, Co Cork, Ireland Glens Falls...
In [4]:
df1=pd.read_csv('data/ex1.csv')
In [5]:
df1.head()
Out[5]:
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
In [6]:
f = open("data/ex1.csv", 'w')
data = """a,b,c,d,message
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo"""
f.write(data)
f.close()
In [7]:
f = open("data/ex2.csv", 'w')
data = """
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo
"""
f.write(data)
f.close()

df2= pd.read_csv('data/ex2.csv', header=None)
df2
Out[7]:
0 1 2 3 4
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
In [8]:
df2= pd.read_csv('data/ex2.csv', names=['a','b','c','d','message'])
df2
Out[8]:
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
In [9]:
names=['a','b','c','d','message']
df2= pd.read_csv('data/ex2.csv', names=names, index_col='message') # message가 index의 column으로 감
df2
Out[9]:
a b c d
message
hello 1 2 3 4
world 5 6 7 8
foo 9 10 11 12
In [10]:
f = open("data/csv_mindex.csv", 'w')
data = """key1,key2,value1,value2
one,a,1,2
one,b,3,4
one,c,5,6
one,d,7,8
two,a,9,10
two,b,11,12
two,c,13,14
two,d,15,16
"""
f.write(data)
f.close()
  • 계층적 색인 지정
In [11]:
parsed= pd.read_csv('data/csv_mindex.csv', index_col=['key1', 'key2'])
parsed
Out[11]:
value1 value2
key1 key2
one a 1 2
b 3 4
c 5 6
d 7 8
two a 9 10
b 11 12
c 13 14
d 15 16
In [12]:
f = open("data/ex3.txt", 'w')
data = """A         B         C
aaa -0.264438 -1.026059 -0.619500
bbb  0.927272  0.302904 -0.032399
ccc -0.264273 -0.386314 -0.217601
ddd -0.871859 -0.348382  1.100491
"""
f.write(data)
f.close()
In [13]:
result= pd.read_table('data/ex3.txt', sep='\s+') #\s+ :공백이 하나 이상 발생한 경우 구분
result
Out[13]:
A B C
aaa -0.264438 -1.026059 -0.619500
bbb 0.927272 0.302904 -0.032399
ccc -0.264273 -0.386314 -0.217601
ddd -0.871859 -0.348382 1.100491
In [14]:
f = open("data/ex4.csv", 'w')
data = """#Hey!
a,b,c,d,message
#by python
#csv file
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo"""
f.write(data)
f.close()
In [15]:
f = open("data/ex4.csv",'r')
skiplist = []
count=0
while True:
    line = f.readline()
    if not line:
        break
    if '#' in line :
        print(line)
        skiplist.append(count)
    count += 1
f.close()
skiplist
#Hey!

#by python

#csv file

Out[15]:
[0, 2, 3]
In [16]:
f=open('data/ex4.csv', 'r', encoding='utf-8')
lineNum=0
skiplist=[]

while True:
    lines=f.readline()
    if not lines:
        break
    if '#' in lines:
        skiplist.append(lineNum)
    lineNum +=1 
f.close()
skiplist
Out[16]:
[0, 2, 3]
In [17]:
df1= pd.read_csv('data/ex4.csv', skiprows=[0,2,3]) # 불필요한 줄 지움 
df1 
Out[17]:
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
In [18]:
df1= pd.read_csv('data/ex4.csv', skiprows= skiplist) # 불필요한 줄 지움 
df2
Out[18]:
a b c d
message
hello 1 2 3 4
world 5 6 7 8
foo 9 10 11 12
In [19]:
f = open("data/ex5.csv", 'w')
data = """something,a,b,c,d,message
one,1,2,3,4,NA
two,5,6,,8,world
three,9,10,11,12,foo
"""
f.write(data)
f.close()
In [20]:
result= pd.read_csv('data/ex5.csv') 
result
Out[20]:
something a b c d message
0 one 1 2 3.0 4 NaN
1 two 5 6 NaN 8 world
2 three 9 10 11.0 12 foo
In [21]:
pd.isnull(result)
Out[21]:
something a b c d message
0 False False False False False True
1 False False False True False False
2 False False False False False False
In [22]:
result=pd.read_csv('data/ex5.csv', na_values=['NULL']) # na_values: 특정한 값을 NaN으로 취급하고 싶을 때 사용, 1 넣으면 1이 NaN으로 바뀜 
result
Out[22]:
something a b c d message
0 one 1 2 3.0 4 NaN
1 two 5 6 NaN 8 world
2 three 9 10 11.0 12 foo
In [23]:
sentinels={'message': ['foo','world'], 'something': ['two']}
result=pd.read_csv('data/ex5.csv', na_values=sentinels)
result
Out[23]:
something a b c d message
0 one 1 2 3.0 4 NaN
1 NaN 5 6 NaN 8 NaN
2 three 9 10 11.0 12 NaN

엑셀파일읽기

In [24]:
xlsx = 'data/ex01.xlsx'
frame= pd.read_excel(xlsx, 'Sheet1')
frame
Out[24]:
a b c d message
0 0 1 2 3 hello
1 4 5 6 7 world
2 9 10 11 12 foo

엑셀파일저장

In [25]:
writer= pd.ExcelWriter('data/ex02.xlsx')
frame.to_excel(writer, 'Sheet1')
writer.save()

누락된 데이터 처리

인자 설명
dropna 누락된 데이터가 있는 축(low,column)을 제외시킨다. 어느정도의 누락데이터까지 용인할것인지 지정 할 수 있다.
fillna 누락된 데이터를 대신할 값을 채우거나 'ffill'이나 'bfill'같은 보간 메서드를 적용한다.
isnull 누락되거나 NA인 값을 알려주는 불리언 값이 저장된 같은 형의 객체를 반환
notnull isnull과 반대되는 메서드
In [24]:
import numpy as np 
import pandas as pd 
In [25]:
string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])
string_data
Out[25]:
0     aardvark
1    artichoke
2          NaN
3      avocado
dtype: object
In [26]:
string_data.isnull()
Out[26]:
0    False
1    False
2     True
3    False
dtype: bool
In [27]:
string_data[0]= None 
string_data.isnull()
Out[27]:
0     True
1    False
2     True
3    False
dtype: bool
In [28]:
from numpy import nan as NA 
data= pd.Series([1,NA,3.5,NA,7])
data.dropna()
Out[28]:
0    1.0
2    3.5
4    7.0
dtype: float64
In [29]:
data[data.notnull()] #data.dropna()와 같은 결과 
Out[29]:
0    1.0
2    3.5
4    7.0
dtype: float64
In [30]:
data = pd.DataFrame([[1., 6.5, 3.], [1., NA, NA],
                     [NA, NA, NA], [NA, 6.5, 3.]])
data
Out[30]:
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
2 NaN NaN NaN
3 NaN 6.5 3.0
In [31]:
cleand=data.dropna() #NaN이 하나라도 들어있으면 사라짐 
cleand
Out[31]:
0 1 2
0 1.0 6.5 3.0
In [32]:
cleand= data.dropna(how="all") # how=all : 모두 NaN이면 삭제됨
cleand
Out[32]:
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
3 NaN 6.5 3.0
In [33]:
# 4번 열을 추가하고 NA 값으로 지정 
data[4]=NA
data
Out[33]:
0 1 2 4
0 1.0 6.5 3.0 NaN
1 1.0 NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN 6.5 3.0 NaN
In [34]:
cleand= data.dropna(axis='columns', how="all")
#cleand= data.dropna(axis='1', how="all") 위의 코드와 동일 
cleand
Out[34]:
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
2 NaN NaN NaN
3 NaN 6.5 3.0
In [35]:
df= pd.DataFrame(np.random.randn(7,3)) #세로가 7개 가로가 3개인
df
Out[35]:
0 1 2
0 -0.131701 0.165730 -1.445157
1 -0.916618 1.702881 0.635776
2 0.591533 0.112397 -0.523709
3 1.330796 -0.356226 -0.715347
4 0.808900 -0.128411 0.492950
5 -0.303647 -1.336609 -1.564481
6 0.328623 -0.499420 0.384282
In [36]:
df.iloc[0:3,1]=NA
df.iloc[:1,2]=NA
df
Out[36]:
0 1 2
0 -0.131701 NaN NaN
1 -0.916618 NaN 0.635776
2 0.591533 NaN -0.523709
3 1.330796 -0.356226 -0.715347
4 0.808900 -0.128411 0.492950
5 -0.303647 -1.336609 -1.564481
6 0.328623 -0.499420 0.384282
In [37]:
cleaned= df.dropna(thresh=2) # 2개이상 NaN이 있으면 삭제됨  
cleaned 
Out[37]:
0 1 2
1 -0.916618 NaN 0.635776
2 0.591533 NaN -0.523709
3 1.330796 -0.356226 -0.715347
4 0.808900 -0.128411 0.492950
5 -0.303647 -1.336609 -1.564481
6 0.328623 -0.499420 0.384282

결측치 채우기

In [38]:
df
Out[38]:
0 1 2
0 -0.131701 NaN NaN
1 -0.916618 NaN 0.635776
2 0.591533 NaN -0.523709
3 1.330796 -0.356226 -0.715347
4 0.808900 -0.128411 0.492950
5 -0.303647 -1.336609 -1.564481
6 0.328623 -0.499420 0.384282
In [39]:
filled=df.fillna(0) # NaN을 0으로 대체 
filled
Out[39]:
0 1 2
0 -0.131701 0.000000 0.000000
1 -0.916618 0.000000 0.635776
2 0.591533 0.000000 -0.523709
3 1.330796 -0.356226 -0.715347
4 0.808900 -0.128411 0.492950
5 -0.303647 -1.336609 -1.564481
6 0.328623 -0.499420 0.384282
In [40]:
filled2=df.fillna({1:0.9, 2:0})
filled2
Out[40]:
0 1 2
0 -0.131701 0.900000 0.000000
1 -0.916618 0.900000 0.635776
2 0.591533 0.900000 -0.523709
3 1.330796 -0.356226 -0.715347
4 0.808900 -0.128411 0.492950
5 -0.303647 -1.336609 -1.564481
6 0.328623 -0.499420 0.384282
In [41]:
df.fillna(0, inplace=False) #원본데이터 안바뀜
df
Out[41]:
0 1 2
0 -0.131701 NaN NaN
1 -0.916618 NaN 0.635776
2 0.591533 NaN -0.523709
3 1.330796 -0.356226 -0.715347
4 0.808900 -0.128411 0.492950
5 -0.303647 -1.336609 -1.564481
6 0.328623 -0.499420 0.384282
In [42]:
df.fillna(0, inplace=True) #원본데이터 0으로 바뀜 
df
Out[42]:
0 1 2
0 -0.131701 0.000000 0.000000
1 -0.916618 0.000000 0.635776
2 0.591533 0.000000 -0.523709
3 1.330796 -0.356226 -0.715347
4 0.808900 -0.128411 0.492950
5 -0.303647 -1.336609 -1.564481
6 0.328623 -0.499420 0.384282
In [43]:
df= pd.DataFrame(np.random.randn(7,3))
df.iloc[2:,1]=NA
df.iloc[4:,2]=NA
df
Out[43]:
0 1 2
0 -0.924464 -0.377605 -1.641186
1 -1.683392 -0.488751 -0.973592
2 1.298459 NaN -0.766517
3 0.340175 NaN -0.209967
4 -0.890470 NaN NaN
5 0.125698 NaN NaN
6 1.980833 NaN NaN
In [44]:
filled= df.fillna(method='ffill')
filled
Out[44]:
0 1 2
0 -0.924464 -0.377605 -1.641186
1 -1.683392 -0.488751 -0.973592
2 1.298459 -0.488751 -0.766517
3 0.340175 -0.488751 -0.209967
4 -0.890470 -0.488751 -0.209967
5 0.125698 -0.488751 -0.209967
6 1.980833 -0.488751 -0.209967
In [45]:
filled= df.fillna(method='ffill', limit=2) #2개만 채움
filled
Out[45]:
0 1 2
0 -0.924464 -0.377605 -1.641186
1 -1.683392 -0.488751 -0.973592
2 1.298459 -0.488751 -0.766517
3 0.340175 -0.488751 -0.209967
4 -0.890470 NaN -0.209967
5 0.125698 NaN -0.209967
6 1.980833 NaN NaN

def.fillna(value=, method='ffill', axis=0, inplace=, limit=)

  • value : 비어있는 값을 채울 스칼라 값이나 dictonary 형식의 객체
  • method : 보간법(기본=ffill)
  • axis : 값을 채워넣을 축(기본 axis=0)
  • inplace : 복사본을 생성하지 않고 호출한 객체에 값을 반환(기본값=False )
  • limit : 값을 앞 또는 뒤로 몇개까지 채울지 지정
In [46]:
data = pd.DataFrame({'k1': ['one', 'two'] * 3 + ['two'],
                     'k2': [1, 1, 2, 3, 3, 4, 4]})
data
Out[46]:
k1 k2
0 one 1
1 two 1
2 one 2
3 two 3
4 one 3
5 two 4
6 two 4
In [47]:
data.duplicated() # 중복이 되는 것 True
Out[47]:
0    False
1    False
2    False
3    False
4    False
5    False
6     True
dtype: bool
In [48]:
data.drop_duplicates() # 중복된 것 사라짐 
Out[48]:
k1 k2
0 one 1
1 two 1
2 one 2
3 two 3
4 one 3
5 two 4
In [49]:
data['v1']=range(7)
data
Out[49]:
k1 k2 v1
0 one 1 0
1 two 1 1
2 one 2 2
3 two 3 3
4 one 3 4
5 two 4 5
6 two 4 6
In [50]:
data.drop_duplicates(['k1']) #k1의 중복요소 삭제  
Out[50]:
k1 k2 v1
0 one 1 0
1 two 1 1
In [51]:
data.drop_duplicates(['k2'])#k2의 중복요소 삭제
Out[51]:
k1 k2 v1
0 one 1 0
2 one 2 2
3 two 3 3
5 two 4 5
In [52]:
data.drop_duplicates(['v1']) # 중복이 없어서 똑같이 나옴 
Out[52]:
k1 k2 v1
0 one 1 0
1 two 1 1
2 one 2 2
3 two 3 3
4 one 3 4
5 two 4 5
6 two 4 6
In [53]:
data
Out[53]:
k1 k2 v1
0 one 1 0
1 two 1 1
2 one 2 2
3 two 3 3
4 one 3 4
5 two 4 5
6 two 4 6
In [54]:
data.drop_duplicates(['k1','k2'], keep='last') # keep='last' : 마지막이 살아남음
# k1과 k2의 값이 같은 건 two 4 5/ two 4 6 이 중 마지막이 살아남음  
Out[54]:
k1 k2 v1
0 one 1 0
1 two 1 1
2 one 2 2
3 two 3 3
4 one 3 4
6 two 4 6

데이터 변형하기

In [55]:
data = pd.DataFrame({'food': ['bacon', 'pulled pork', 'bacon',
                              'Pastrami', 'corned beef', 'Bacon',
                              'pastrami', 'honey ham', 'nova lox'],
                     'ounces': [4, 3, 12, 6, 7.5, 8, 3, 5, 6]})
data
Out[55]:
food ounces
0 bacon 4.0
1 pulled pork 3.0
2 bacon 12.0
3 Pastrami 6.0
4 corned beef 7.5
5 Bacon 8.0
6 pastrami 3.0
7 honey ham 5.0
8 nova lox 6.0
In [56]:
meat_to_animal = {
  'bacon': 'pig',
  'pulled pork': 'pig',
  'pastrami': 'cow',
  'corned beef': 'cow',
  'honey ham': 'pig',
  'nova lox': 'salmon'
}
meat_to_animal
Out[56]:
{'bacon': 'pig',
 'pulled pork': 'pig',
 'pastrami': 'cow',
 'corned beef': 'cow',
 'honey ham': 'pig',
 'nova lox': 'salmon'}
In [57]:
#소문자로 바꾸기 
lower_cased=data['food'].str.lower()
lower_cased
Out[57]:
0          bacon
1    pulled pork
2          bacon
3       pastrami
4    corned beef
5          bacon
6       pastrami
7      honey ham
8       nova lox
Name: food, dtype: object
In [58]:
data['animal']= lower_cased.map(meat_to_animal)
data
Out[58]:
food ounces animal
0 bacon 4.0 pig
1 pulled pork 3.0 pig
2 bacon 12.0 pig
3 Pastrami 6.0 cow
4 corned beef 7.5 cow
5 Bacon 8.0 pig
6 pastrami 3.0 cow
7 honey ham 5.0 pig
8 nova lox 6.0 salmon
In [60]:
#lower_cased=data['food'].str.lower()
#data['animal']= lower_cased.map(meat_to_animal)
data['animal']= data['food'].map(lambda x: meat_to_animal[x.lower()])
data
Out[60]:
food ounces animal
0 bacon 4.0 pig
1 pulled pork 3.0 pig
2 bacon 12.0 pig
3 Pastrami 6.0 cow
4 corned beef 7.5 cow
5 Bacon 8.0 pig
6 pastrami 3.0 cow
7 honey ham 5.0 pig
8 nova lox 6.0 salmon
In [62]:
data=pd.Series([1., -999., 2., -999., -1000., 3.])
data
Out[62]:
0       1.0
1    -999.0
2       2.0
3    -999.0
4   -1000.0
5       3.0
dtype: float64
In [63]:
data2 = data.replace(-999, np.nan)
data2
Out[63]:
0       1.0
1       NaN
2       2.0
3       NaN
4   -1000.0
5       3.0
dtype: float64
In [64]:
data2 = data.replace([-999, -1000], np.nan)
data2
Out[64]:
0    1.0
1    NaN
2    2.0
3    NaN
4    NaN
5    3.0
dtype: float64
In [65]:
data2 = data.replace([-999, -1000], [np.nan, 0])
data2
Out[65]:
0    1.0
1    NaN
2    2.0
3    NaN
4    0.0
5    3.0
dtype: float64
In [66]:
data2= data.replace({-999.:np.nan, -1000.:0})
#-999 ->Nan , -1000 ->0
data2
Out[66]:
0    1.0
1    NaN
2    2.0
3    NaN
4    0.0
5    3.0
dtype: float64
In [79]:
data = pd.DataFrame(np.arange(12).reshape((3, 4)),
                    index=['Ohio', 'Colorado', 'New York'],
                    columns=['one', 'two', 'three', 'four'])
data
Out[79]:
one two three four
Ohio 0 1 2 3
Colorado 4 5 6 7
New York 8 9 10 11
In [80]:
transform= lambda x:x[:4].upper() #X를 4자리로 끊음 
data.index.map(transform)
Out[80]:
Index(['OHIO', 'COLO', 'NEW '], dtype='object')
In [81]:
data.index
Out[81]:
Index(['Ohio', 'Colorado', 'New York'], dtype='object')
In [82]:
data.index= data.index.map(transform)
data
Out[82]:
one two three four
OHIO 0 1 2 3
COLO 4 5 6 7
NEW 8 9 10 11
  • str.title : 단어의 시작 부분에 있는 문자는 대문자로, 나머지는 모두 소문자로 만든다.
In [83]:
data.rename(index=str.title, columns=str.upper)
Out[83]:
ONE TWO THREE FOUR
Ohio 0 1 2 3
Colo 4 5 6 7
New 8 9 10 11
In [84]:
data
Out[84]:
one two three four
OHIO 0 1 2 3
COLO 4 5 6 7
NEW 8 9 10 11
In [85]:
data.rename(index={'OHIO':'INDIANA'}, columns={'three':'peekaboo'})
Out[85]:
one two peekaboo four
INDIANA 0 1 2 3
COLO 4 5 6 7
NEW 8 9 10 11
In [86]:
data
Out[86]:
one two three four
OHIO 0 1 2 3
COLO 4 5 6 7
NEW 8 9 10 11
In [90]:
data.rename(index={'OHIO':'INDIANA'}, inplace=True) # 기존 객체를 수정 
data
Out[90]:
one two three four
INDIANA 0 1 2 3
COLO 4 5 6 7
NEW 8 9 10 11
In [91]:
data
Out[91]:
one two three four
INDIANA 0 1 2 3
COLO 4 5 6 7
NEW 8 9 10 11
  • 나이 나누기
    18~25(0)
    26~35(1)
    35~60(2)
    60이상(3)
In [94]:
ages = [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32] 
In [95]:
bins=[18,25,35,60,100] # 각 구간을 나눠줄 숫자값 
cats= pd.cut(ages,bins) #pd.cut(카테고리화 할 숫자데이터, 자를 구간의 구분값)
cats
Out[95]:
[(18, 25], (18, 25], (18, 25], (25, 35], (18, 25], ..., (25, 35], (60, 100], (35, 60], (35, 60], (25, 35]]
Length: 12
Categories (4, interval[int64]): [(18, 25] < (25, 35] < (35, 60] < (60, 100]]
In [96]:
cats.codes #각 성분이 몇번쨰 구간에 속해있는지 정수 index로 표시됨 
Out[96]:
array([0, 0, 0, 1, 0, 0, 2, 1, 3, 2, 2, 1], dtype=int8)
In [172]:
cats.categories # ( ] : 왼쪽 미포함, 오른쪽 포함
Out[172]:
IntervalIndex([(18, 25], (25, 35], (35, 60], (60, 100]],
              closed='right',
              dtype='interval[int64]')
In [97]:
pd.value_counts(cats) # 각 구간의 성분의 개수 
Out[97]:
(18, 25]     5
(35, 60]     3
(25, 35]     3
(60, 100]    1
dtype: int64
In [98]:
pd.cut(ages,[18,25,35,60,100], right=False) # [ ) : 왼쪽 포함, 오른쪽 미포함
Out[98]:
[[18, 25), [18, 25), [25, 35), [25, 35), [18, 25), ..., [25, 35), [60, 100), [35, 60), [35, 60), [25, 35)]
Length: 12
Categories (4, interval[int64]): [[18, 25) < [25, 35) < [35, 60) < [60, 100)]
In [99]:
pd.cut(ages,[18,25,35,60,100], right=True) # 위와 반대 
Out[99]:
[(18, 25], (18, 25], (18, 25], (25, 35], (18, 25], ..., (25, 35], (60, 100], (35, 60], (35, 60], (25, 35]]
Length: 12
Categories (4, interval[int64]): [(18, 25] < (25, 35] < (35, 60] < (60, 100]]
In [100]:
group_names= ['Youth', 'youngAdult', 'MiddleAged', 'Senior']
In [101]:
data2= pd.cut(ages,bins,labels=group_names)
data2
Out[101]:
[Youth, Youth, Youth, youngAdult, Youth, ..., youngAdult, Senior, MiddleAged, MiddleAged, youngAdult]
Length: 12
Categories (4, object): [Youth < youngAdult < MiddleAged < Senior]
In [102]:
data2.value_counts()
Out[102]:
Youth         5
youngAdult    3
MiddleAged    3
Senior        1
dtype: int64

각 구간 구분값을 bin으로 정의해서 나누었는데 pandas에서 알아서 판단하여 데이터의 길이를 잘라주고 구간을 설정할 수도 있음.

In [105]:
data= np.random.rand(20)
data
Out[105]:
array([0.7166629 , 0.27019459, 0.74586198, 0.46917089, 0.45317755,
       0.10626844, 0.08305884, 0.57318399, 0.5936407 , 0.78475135,
       0.33795658, 0.99624303, 0.2733613 , 0.89804862, 0.10861183,
       0.43367864, 0.09130907, 0.8281011 , 0.54757824, 0.0145025 ])

데이터 성분값을 기준으로 자동으로 구간을 나누게 하기 위해서 나눌 구간의 개수만 입력해준다 (성분의 최소값~최대값을 보고 4개구간 나눔)

In [106]:
pd.cut(data, 4, precision=2) #precision=2 소수점 2자리까지 표현 
Out[106]:
[(0.51, 0.75], (0.26, 0.51], (0.51, 0.75], (0.26, 0.51], (0.26, 0.51], ..., (0.26, 0.51], (0.014, 0.26], (0.75, 1.0], (0.51, 0.75], (0.014, 0.26]]
Length: 20
Categories (4, interval[float64]): [(0.014, 0.26] < (0.26, 0.51] < (0.51, 0.75] < (0.75, 1.0]]
In [107]:
data= pd.DataFrame(np.random.randn(1000,4)) #n붙이면 정규분포.. 
data
Out[107]:
0 1 2 3
0 0.651133 1.584606 2.304293 -0.585606
1 3.000024 -0.510052 -0.256742 1.269666
2 -1.460685 0.493399 -0.285212 0.711587
3 -0.900536 0.580821 1.830050 -0.017385
4 -0.526212 -1.039466 0.856561 -0.704050
... ... ... ... ...
995 1.224748 -0.389117 1.182251 -1.544449
996 -0.665040 -0.029167 0.611918 -0.382876
997 -0.134677 -1.843704 2.086748 0.926602
998 -0.528677 0.842454 0.240342 0.484023
999 -0.501713 0.430430 0.889384 -0.380317

1000 rows × 4 columns

In [108]:
data.describe()
Out[108]:
0 1 2 3
count 1000.000000 1000.000000 1000.000000 1000.000000
mean -0.015997 -0.023723 -0.011136 0.019692
std 0.968457 1.046275 0.982243 1.004339
min -3.738030 -4.591808 -3.460535 -3.228758
25% -0.700473 -0.730756 -0.621459 -0.667099
50% -0.006314 -0.056220 0.014056 -0.003606
75% 0.650398 0.670439 0.640740 0.713520
max 3.096388 2.836078 2.779539 2.658785
In [109]:
data[2] #column 2 
Out[109]:
0      2.304293
1     -0.256742
2     -0.285212
3      1.830050
4      0.856561
         ...   
995    1.182251
996    0.611918
997    2.086748
998    0.240342
999    0.889384
Name: 2, Length: 1000, dtype: float64
In [111]:
col= data[2]
col[np.abs(col)>3]
Out[111]:
402   -3.170485
519   -3.460535
Name: 2, dtype: float64
In [112]:
data[(np.abs(data)>3).any(1)] #data가 절대값이 3보다 큰게 하나라도 있으면 무조건 출력
Out[112]:
0 1 2 3
1 3.000024 -0.510052 -0.256742 1.269666
70 -3.738030 0.695613 -0.065118 -0.201237
279 3.007725 -0.548910 1.084639 0.643492
401 3.096388 -4.591808 -0.394104 -0.362914
402 1.227380 1.542498 -3.170485 1.745196
519 -1.471528 1.880856 -3.460535 -0.681035
984 -0.485900 0.986504 0.394333 -3.228758
  • np.sign(x) : x<0일 때 -1, x==0일 떄 0 ,x>0일 때 1을 반환
In [120]:
data[np.abs(data)>3]= np.sign(data)*3 # 절대값이 3보다 큰 값들을 -1 또는 1로 나타내는데 *3을 해서 3 또는 -3으로 나타나짐
data.describe()
Out[120]:
0 1 2 3
count 1000.000000 1000.000000 1000.000000 1000.000000
mean -0.015363 -0.022131 -0.010505 0.019920
std 0.965566 1.040513 0.980196 1.003624
min -3.000000 -3.000000 -3.000000 -3.000000
25% -0.700473 -0.730756 -0.621459 -0.667099
50% -0.006314 -0.056220 0.014056 -0.003606
75% 0.650398 0.670439 0.640740 0.713520
max 3.000000 2.836078 2.779539 2.658785
In [122]:
data.head()
Out[122]:
0 1 2 3
0 0.651133 1.584606 2.304293 -0.585606
1 3.000000 -0.510052 -0.256742 1.269666
2 -1.460685 0.493399 -0.285212 0.711587
3 -0.900536 0.580821 1.830050 -0.017385
4 -0.526212 -1.039466 0.856561 -0.704050
In [121]:
np.sign(data).head() # 부호를 나타냄 
Out[121]:
0 1 2 3
0 1.0 1.0 1.0 -1.0
1 1.0 -1.0 -1.0 1.0
2 -1.0 1.0 -1.0 1.0
3 -1.0 1.0 1.0 -1.0
4 -1.0 -1.0 1.0 -1.0
In [136]:
df = pd.DataFrame(np.arange(5 * 4).reshape((5, 4)))
df
Out[136]:
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15
4 16 17 18 19
In [137]:
sampler = np.random.permutation(5) # 무작위로 섞인 배열 만든다
sampler
Out[137]:
array([4, 1, 3, 2, 0])
In [140]:
df.take(sampler) #sampler 의 값을 인덱스로
Out[140]:
0 1 2 3
4 16 17 18 19
1 4 5 6 7
3 12 13 14 15
2 8 9 10 11
0 0 1 2 3
In [147]:
df.sample(n=3) # 3개의 인덱스 랜덤하게 추출
Out[147]:
0 1 2 3
3 12 13 14 15
0 0 1 2 3
4 16 17 18 19
In [151]:
choices = pd.Series([5, 7, -1, 6, 4])
choices
Out[151]:
0    5
1    7
2   -1
3    6
4    4
dtype: int64
In [152]:
draws = choices.sample(n=10, replace=True)
draws
Out[152]:
4    4
4    4
0    5
1    7
1    7
0    5
1    7
1    7
3    6
1    7
dtype: int64

onehot 인코딩

  • 문자를 숫자로 바꾸어 주는 방법 중 하나로 onehot인코딩이 있다.
  • 가변수로 만들어주는 것인데, 이는 0과 1로 이루어진 열을 나타낸다.
  • 1은 있다 0은 없다를 나타낸다.
In [189]:
df = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'b'],
                   'data1': range(6)})
df
Out[189]:
key data1
0 b 0
1 b 1
2 a 2
3 c 3
4 a 4
5 b 5
In [190]:
pd.get_dummies(df['key']) #df['key]열만 get_dummies해줌 
Out[190]:
a b c
0 0 1 0
1 0 1 0
2 1 0 0
3 0 0 1
4 1 0 0
5 0 1 0
In [191]:
dummies = pd.get_dummies(df['key'])
dummies
Out[191]:
a b c
0 0 1 0
1 0 1 0
2 1 0 0
3 0 0 1
4 1 0 0
5 0 1 0
In [208]:
dummies = pd.get_dummies(df['key'],prefix='key') # prefix를 활용하여 좀 더 명시적으로 표현 
#기존 df의 컬럼을 반영해주기 위해서 작성
dummies
Out[208]:
key_a key_b key_c
0 0 1 0
1 0 1 0
2 1 0 0
3 0 0 1
4 1 0 0
5 0 1 0
In [193]:
df_with_dummy = df[['data1']].join(dummies)
df_with_dummy
Out[193]:
data1 key_a key_b key_c
0 0 0 1 0
1 1 0 1 0
2 2 1 0 0
3 3 0 0 1
4 4 1 0 0
5 5 0 1 0
In [210]:
mnames = ['movie_id', 'title', 'genres']
movies = pd.read_table('movies.dat', sep='::', header=None, names=mnames) 
movies[:10]
Out[210]:
movie_id title genres
0 1 Toy Story (1995) Animation|Children's|Comedy
1 2 Jumanji (1995) Adventure|Children's|Fantasy
2 3 Grumpier Old Men (1995) Comedy|Romance
3 4 Waiting to Exhale (1995) Comedy|Drama
4 5 Father of the Bride Part II (1995) Comedy
5 6 Heat (1995) Action|Crime|Thriller
6 7 Sabrina (1995) Comedy|Romance
7 8 Tom and Huck (1995) Adventure|Children's
8 9 Sudden Death (1995) Action
9 10 GoldenEye (1995) Action|Adventure|Thriller
In [211]:
all_genres=[]
for x in movies.genres:
    all_genres.extend(x.split('|'))
genres=pd.unique(all_genres)
genres
# genres의 장르를 중복없이 나오게 하기
Out[211]:
array(['Animation', "Children's", 'Comedy', 'Adventure', 'Fantasy',
       'Romance', 'Drama', 'Action', 'Crime', 'Thriller', 'Horror',
       'Sci-Fi', 'Documentary', 'War', 'Musical', 'Mystery', 'Film-Noir',
       'Western'], dtype=object)
In [212]:
zero_matrix=np.zeros((len(movies), len(genres)))
dummies= pd.DataFrame(zero_matrix, columns=genres)
dummies
Out[212]:
Animation Children's Comedy Adventure Fantasy Romance Drama Action Crime Thriller Horror Sci-Fi Documentary War Musical Mystery Film-Noir Western
0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
3878 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3879 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3880 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3881 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3882 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

3883 rows × 18 columns

In [213]:
gen= movies.genres[0]
gen.split('|')
dummies.columns.get_indexer(gen.split('|'))
Out[213]:
array([0, 1, 2], dtype=int64)
In [214]:
dummies
Out[214]:
Animation Children's Comedy Adventure Fantasy Romance Drama Action Crime Thriller Horror Sci-Fi Documentary War Musical Mystery Film-Noir Western
0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
3878 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3879 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3880 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3881 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3882 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

3883 rows × 18 columns

  • enumerate
    : 보통 for문과 함께 사용
    : 인덱스 값을 포함하는 enumerate객체를 리턴
    : for문처럼 반복되는 구간에서 객체가 현재 어느 위치에 있는지 알려주는 인덱스 값이 필요할 때 사용하면 유용
In [215]:
for i, gen in enumerate(movies.genres):
    indices = dummies.columns.get_indexer(gen.split('|')) #gen 첫번째 줄에 나와있는 string 
    dummies.iloc[i, indices] = 1 

dummies
Out[215]:
Animation Children's Comedy Adventure Fantasy Romance Drama Action Crime Thriller Horror Sci-Fi Documentary War Musical Mystery Film-Noir Western
0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1 0.0 1.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
4 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
3878 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3879 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3880 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3881 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3882 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

3883 rows × 18 columns

In [216]:
pd.set_option('display.max_columns', 25)
#pd.set_option('display.max_row', 10)
movies_windic= movies.join(dummies.add_prefix('Genre_'))
movies_windic.head()
Out[216]:
movie_id title genres Genre_Animation Genre_Children's Genre_Comedy Genre_Adventure Genre_Fantasy Genre_Romance Genre_Drama Genre_Action Genre_Crime Genre_Thriller Genre_Horror Genre_Sci-Fi Genre_Documentary Genre_War Genre_Musical Genre_Mystery Genre_Film-Noir Genre_Western
0 1 Toy Story (1995) Animation|Children's|Comedy 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1 2 Jumanji (1995) Adventure|Children's|Fantasy 0.0 1.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2 3 Grumpier Old Men (1995) Comedy|Romance 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3 4 Waiting to Exhale (1995) Comedy|Drama 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
4 5 Father of the Bride Part II (1995) Comedy 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
In [231]:
np.random.seed(12345)
values = np.random.rand(10)
values
Out[231]:
array([0.92961609, 0.31637555, 0.18391881, 0.20456028, 0.56772503,
       0.5955447 , 0.96451452, 0.6531771 , 0.74890664, 0.65356987])
In [232]:
bins=[0, 0.2, 0.4, 0.6, 0.8, 1]
pd.get_dummies(pd.cut(values, bins))
Out[232]:
(0.0, 0.2] (0.2, 0.4] (0.4, 0.6] (0.6, 0.8] (0.8, 1.0]
0 0 0 0 0 1
1 0 1 0 0 0
2 1 0 0 0 0
3 0 1 0 0 0
4 0 0 1 0 0
5 0 0 1 0 0
6 0 0 0 0 1
7 0 0 0 1 0
8 0 0 0 1 0
9 0 0 0 1 0
In [243]:
val= ' a,b, guido '
val.split(',') #공백포함됨
Out[243]:
[' a', 'b', ' guido ']
In [244]:
val
Out[244]:
' a,b, guido '
In [245]:
val= 'a,b, guido'
val.strip() #양끝 공백 제거
Out[245]:
'a,b, guido'
In [246]:
pieces = [x.strip() for x in val.split(',')]
pieces
Out[246]:
['a', 'b', 'guido']
In [221]:
first, second, third= pieces 
first+ '::'+ second+ '::'+ third
Out[221]:
'a::b::guido'
In [247]:
first
Out[247]:
'a'
In [249]:
pieces
Out[249]:
['a', 'b', 'guido']
In [222]:
'::'.join(pieces)
Out[222]:
'a::b::guido'
In [223]:
'guido' in val
Out[223]:
True
In [256]:
val.index(',')
Out[256]:
1
In [257]:
val.find(':')
Out[257]:
-1
In [248]:
val.find(',')
Out[248]:
1
In [259]:
val.index(':')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-259-2c016e7367ac> in <module>
----> 1 val.index(':')

ValueError: substring not found
In [261]:
val.count(',')
Out[261]:
2
In [262]:
val.replace(',', '::')
Out[262]:
'a::b:: guido'
In [263]:
val.replace(',', '')
Out[263]:
'ab guido'

'Python' 카테고리의 다른 글

Python_판다스_데이터분석  (0) 2020.09.14
Python_example  (0) 2020.09.11
Python_pandas 문제  (0) 2020.09.09
Python_pandas(판다스):시리즈,데이터프레임,색인,인덱싱,sorting  (0) 2020.09.09
Python 기초09_vectorize  (0) 2020.09.08

+ Recent posts