๐Ÿผ pandas ๐Ÿผ

  • panel datas์˜ ์•ฝ์ž
  • ํŒŒ์ด์ฌ์„ ํ™œ์šฉํ•œ ๋ฐ์ดํ„ฐ ๋ถ„์„์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ํ™œ์šฉ๋จ
  • Series : 1์ฐจ์› ๋ฐฐ์—ด ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๊ตฌ์กฐ
  • DataFrame : 2์ฐจ์› ๋ฐฐ์—ด ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๊ตฌ์กฐ

๐Ÿถ DataFrame ๐Ÿถ

  • ํ–‰๊ณผ ์—ด๋กœ ๊ตฌ๋ถ„
  • ์ธ๋ฑ์Šค : ํ–‰์„ ๊ตฌ๋ถ„, ๋ณ„๋„๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ •์ˆ˜๋กœ ์ง€์ •(ํ•œ๋ฒˆ ์„ค์ •๋˜๋ฉด ๋ณ€๊ฒฝ๋ถˆ๊ฐ€)
  • ์ปฌ๋Ÿผ :์—ด์„ ๊ตฌ๋ถ„
  • ์…€๊ณผ ์…€ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅ

๐Ÿผ ๋ฐ์ดํ„ฐ์ค€๋น„

https://jumin.mois.go.kr/#


๐Ÿปโ€โ„๏ธ pandas๋ฌธ๋ฒ•

loc, iloc : ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์˜ row ๋˜๋Š” column์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•

axis

  • axis=0 : ํ–‰ ๋ฐฉํ–ฅ์„ ์ถ•์œผ๋กœ ๊ณ„์‚ฐ
  • axis=1 : ์—ด ๋ฐฉํ–ฅ์„ ์ถ•์œผ๋กœ ๊ณ„์‚ฐ

๐Ÿฆ ๋ฐ์ดํ„ฐ ์ฝ์–ด์˜ค๊ธฐ

import pandas as pd
df = pd.read_csv('/content/age_2019.csv', encoding='utf-8')

๐Ÿฏ ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ

# ํ–‰์ •๊ตฌ์—ญ ์ปฌ๋Ÿผ์˜ ํ–‰์ •์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ฃผ์†Œ ๋ฐ์ดํ„ฐ๋งŒ ์‚ฌ์šฉ
# ex) ์„œ์šธํŠน๋ณ„์‹œ ์ข…๋กœ๊ตฌ ์‚ผ์ฒญ๋™(111105400) -> ์„œ์šธํŠน๋ณ„์‹œ ์ข…๋กœ๊ตฌ ์‚ผ์ฒญ๋™
names_split = df['ํ–‰์ •๊ตฌ์—ญ'].str.split('(')
df['ํ–‰์ •๊ตฌ์—ญ'] = names_split.str.get(0)

# ํ–‰์ •๊ตฌ์—ญ์„ ์ œ์™ธํ•œ ์ปฌ๋Ÿผ๋ช… ๋ณ€๊ฒฝ
columns_list = df.columns
final_col = {}
for col in columns_list[1:]: # slice ์ด์œ ? ํ–‰์ •๊ตฌ์—ญ ์ œ์™ธํ•˜๊ณ  ์‹คํ–‰
  final_col[col] = col.split('_')[2] # dictionary ๋ฌธ๋ฒ•

# ์ปฌ๋Ÿผ๋ช… ๋ณ€๊ฒฝ
df.rename(columns=final_col, inplace=True)

# ๋ฐ์ดํ„ฐ ์ฝค๋งˆ ์ œ๊ฑฐํ•˜๊ณ  ์ˆซ์žํ˜•ํƒœ๋กœ ๋ณ€ํ™˜
df.replace('[^\w]','', regex=True, inplace=True) # ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•œ ๋ชจ๋“  ์ปฌ๋Ÿผ์˜ ํŠน์ˆ˜๊ธฐํ˜ธ ์ œ๊ฑฐ

# ์ธ๋ฑ์Šค ๋ณ€๊ฒฝ 0, 1, 2 -> ์„œ์šธํŠน๋ณ„์‹œ, ์„œ์šธํŠน๋ณ„์‹œ ์ข…๋กœ๊ตฌ . . 
df.set_index(keys=['ํ–‰์ •๊ตฌ์—ญ'], inplace=True)

# ํ˜•๋ณ€ํ™˜
df = df.astype('int')
df.info()
df.isna().sum() # NaN ๋ฐ์ดํ„ฐ ํ™•์ธ
df.dropna(inplace=True) # NaN ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ

๐Ÿฆ’ ๋น„์œจ๊ณ„์‚ฐ / ๋ถˆํ•„์š”๋ฐ์ดํ„ฐ ์‚ญ์ œ

# ์ „์ฒด๋ฐ์ดํ„ฐ / ์ด์ธ๊ตฌ์ˆ˜ 
df = df.div(df['์ด์ธ๊ตฌ์ˆ˜'], axis=0)

# ์ด ์ธ๊ตฌ์ˆ˜์™€ ์—ฐ๋ น๊ตฌ๊ฐ„ ์ธ๊ตฌ์ˆ˜ ์‚ญ์ œ
del df['์ด์ธ๊ตฌ์ˆ˜'], df['์—ฐ๋ น๊ตฌ๊ฐ„์ธ๊ตฌ์ˆ˜']

โž• ์ •์ œ๋œ ํŒŒ์ผ ์ €์žฅ df.tocsv('2019์ธ๊ตฌ๊ตฌ์กฐ_์ •์ œ๋ฐ์ดํ„ฐ.csv', encoding='utf-8-sig')

๐Ÿฎ ์ธ๊ตฌ๊ตฌ์กฐ ์ €์žฅ/ ์‹œ๊ฐํ™”

๐Ÿท ๋น„์Šทํ•œ ์ธ๊ตฌ๊ตฌ์กฐ ์ฐพ๊ธฐ/์‹œ๊ฐํ™”

# ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์ธ๊ตฌ๊ตฌ์กฐ์™€ ๊ฐ€๊นŒ์šด ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ home - away
df.sub(df2.iloc[0], axis=1)

# ์šฐ๋ฆฌ๋™๋„ค์™€ ๋น„์Šทํ•œ ์ธ๊ตฌ๊ตฌ์กฐ ์ฐพ๊ธฐ
import numpy as np
np.power(df.sub(df2.iloc[0],axis=1),2).sum(axis=1).sort_values().index[1:6] # ์ž๊ธฐ์ž์‹ ์€ ๋นผ๊ณ 

# ์šฐ๋ฆฌ๋™๋„ค์™€ ๋น„์Šทํ•œ ์ธ๊ตฌ๊ตฌ์กฐ ์‹œ๊ฐํ™”
df.loc[np.power(df.sub(df2.iloc[0],axis=1),2).sum(axis=1).sort_values().index[1:6]].T.plot()
plt.show()

# ๋ฐ์ดํ„ฐ ์ฝ์–ด์˜ค๊ธฐ
import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv('/content/age_2019.csv', encoding='utf-8') # csvํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ

# ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ
name_split = df['ํ–‰์ •๊ตฌ์—ญ'].str.split('(') # ํ–‰์ •๊ตฌ์—ญ ์ปฌ๋Ÿผ์„ stringํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ ํ›„ ( ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ”
df['ํ–‰์ •๊ตฌ์—ญ'] = name_split.str.get(0) # ๋‚˜๋ˆ ์ง„ name_split์˜ 0๋ฒˆ์งธ ์ปฌ๋Ÿผ๋งŒ์„ ํ–‰์ •๊ตฌ์—ญ์œผ๋กœ ์ง€์ •

# ํ–‰์ •๊ตฌ์—ญ ์ œ์™ธ ์ปฌ๋Ÿผ๋ช… ๋ณ€๊ฒฝ
columns_list = df.columns # ์ปฌ๋Ÿผ ๋ช…๋“ค์„ ์ €์žฅ
final_col = {} # ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ
for col in columns_list[1:]:# ํ–‰์ •๊ตฌ์—ญ์„ ์ œ์™ธํ•œ ์ปฌ๋Ÿผ๋ช…๋“ค๋งŒ
  final_col[col] = col.split('_')[2] # _๊ธฐ์ค€ ๋‘๋ฒˆ์งธ๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ์˜ value๋กœ ์ง€์ •

# ์ปฌ๋Ÿผ๋ช… ๋ณ€๊ฒฝ
df.rename(columns=final_col, inplace=True) # inplace = True : ๋ฐ”๋กœ ์‹คํ–‰ํ•ด๋ผ
# ๋ฐ์ดํ„ฐ๋“ค์„ ์ฝค๋งˆ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ˆซ์žํ˜•ํƒœ๋กœ ๋ณ€ํ™˜
df.replace('[^\w]','', regex=True, inplace=True) # regex=True ์ •๊ทœ ํ‘œํ˜„์‹์œผ๋กœ ๋ฌธ์ž์—ด ์น˜ํ™˜์„ ์›ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ
# ์ธ๋ฑ์Šค ๋ณ€๊ฒฝ
df.set_index(keys=['ํ–‰์ •๊ตฌ์—ญ'], inplace=True) # ์ธ๋ฑ์Šค๋ฅผ 0,1,2..๊ฐ™์€๊ฐ’๋“ค์ด ์•„๋‹Œ ํ–‰์ •๊ตฌ์—ญ ๋ช…์œผ๋กœ ์ง€์ •ํ•ด์คŒ
# ํ˜•๋ณ€ํ™˜
df = df.astype('int') # df์˜ type์„ int(์ •์ˆ˜ํ˜•)๋กœ ๋ณ€๊ฒฝ
df.dropna(inplace=True) #NaN๋ฐ์ดํ„ฐ ์ œ๊ฑฐ

# ์ „์ฒด ๋ฐ์ดํ„ฐ / ์ด ์ธ๊ตฌ์ˆ˜ => ๋น„์œจ๊ณ„์‚ฐ
df = df.div(df['์ด์ธ๊ตฌ์ˆ˜'], axis=0) # ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ด ์ธ๊ตฌ์ˆ˜๋กœ ๋‚˜๋ˆ”
# ์ด ์ธ๊ตฌ์ˆ˜, ์—ฐ๋ น๊ตฌ๊ฐ„ ์ธ๊ตฌ์ˆ˜ ์‚ญ์ œ(๋น„์œจ๋กœ ๊ณ„์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋‘ ๊ทธ ๊ฐ’์ด 1์ด๋ฏ€๋กœ ํ•„์š”์—†์Œ )
del df['์ด์ธ๊ตฌ์ˆ˜'], df['์—ฐ๋ น๊ตฌ๊ฐ„์ธ๊ตฌ์ˆ˜']

# ์ •์ œ๋œ ํŒŒ์ผ ์ €์žฅํ•˜๊ณ  ์‹ถ์œผ๋ฉด df.to_csv('age_2019์ •์ œ๋ฐ์ดํ„ฐ.csv', encoding='utf-8-sig')

# ๊ถ๊ธˆํ•œ ์ง€์—ญ ์ด๋ฆ„ ์ž…๋ ฅ๋ฐ›๊ณ  ํ•ด๋‹น ์ง€์—ญ ์ธ๊ตฌ๊ตฌ์กฐ ์ €์žฅ
address = input('์ธ๊ตฌ๊ตฌ์กฐ๊ฐ€ ์•Œ๊ณ  ์‹ถ์€ ์ง€์—ญ์˜ ์ฃผ์†Œ(์๋ฉด๋™๋‹จ์œ„)๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š” >> ')

a = df.index.str.contains(address) # input์œผ๋กœ ๋ฐ›์€ ํ•ด๋‹น์ง€์—ญ์˜ ์ธ๋ฑ์Šค ์ฐพ๊ธฐ
df2 = df[a] # ํ•ด๋‹น ์ง€์—ญ์˜ ์ธ๊ตฌ๊ตฌ์กฐ ์ €์žฅ

# ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ง€์—ญ์˜ ์ธ๊ตฌ๊ตฌ์กฐ์™€ ๊ฐ€๊นŒ์šด ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ
# ์šฐ๋ฆฌ ๋™๋„ค์™€ ๋น„์Šทํ•œ ์ธ๊ตฌ๊ตฌ์กฐ ์ฐพ๊ธฐ
# df.sub(df2.iloc[0], axis=1) -> df(์ •์ œํ•œ ์ „์ฒด๋ฐ์ดํ„ฐ)์—์„œ ํ•ด๋‹น์ง€์—ญ์˜ ์ธ๊ตฌ๊ตฌ์กฐ๋ฅผ ๋นผ์คŒ
# np.power(df.sub~~) -> ๋นผ์ค€ ์ธ๊ตฌ๊ตฌ์กฐ ์ œ๊ณฑ
# .sum(axis=1) ์ปฌ๋Ÿผ๊ธฐ์ค€ ํ•ฉ
# .sort_values().index[1:6] ์ž๊ธฐ์ž์‹ ์„ ์ œ์™ธํ•˜๊ณ  ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ
# .T.plot() row์™€ column์„ ๋ฐ”๊พธ๊ณ  ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆผ

df.loc[np.power(df.sub(df2.iloc[0], axis=1),2).sum(axis=1).sort_values().index[1:6]].T.plot()
plt.style.use('ggplot') # ๊ฒฉ์ž๋ฌด๋Šฌ
plt.show()

๐Ÿšฉ ์†Œ๊ฐ ๐Ÿšฉ

์ฒ˜์Œ pandas๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ถ„์„ ์ˆ˜์—…์„ ์ง„ํ–‰ํ•˜์…จ๋Š”๋ฐ, ์–ด์ œ๊นŒ์ง€ ๋ฐฐ์šด ๊ณผ์ •๋ณด๋‹ค๋Š” ๊ฐ„๋‹จํ•ด์ง„๊ฑด ํ™•์‹คํ•œ๋ฐ ์ฒ˜์Œ๋ฐฐ์šฐ๋Š” ๋ฌธ๋ฒ• .. ?์ด๋ผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค. ํŠนํžˆ ๋ฐ์ดํ„ฐ์ „์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ํ˜ผ์ด ์™ ๋น ์ก‹๋‹นใ…Ž.ใ…Ž.ใ…Ž....ใ…Ž............์•„์ง ๋ญ”๊ฐ€ ๋‚ด ๋จธ๋ฆฟ์†์—์„œ ์ •๋ฆฌ๊ฐ€ ์•ˆ๋œ๊ฒƒ๊ฐ™์•„์„œ ์ •๋ฆฌํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

profile
๋ฐฐ๊ณ ํŒŒ์šฉ.

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2022๋…„ 8์›” 25์ผ

๊ธ€์„ ๋ณด๋‹ˆ ์ด๋ฏธ Pandas์— ๋Œ€ํ•œ ์ •๋ฆฌ๋ฅผ ์ž˜ ํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ.. ๋ฌด๋ ค ์€์ฃผ์˜ ์ธ์žฅ์€ ํŒ๋‹ค์ธ๋ฐ ใ…Žใ…Ž ํŒ๋‹ค์˜ ์žฅ์ธ์ด ๋˜์–ด ๋ด…์‹œ๋‹ค ใ…Žใ…Ž

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ