ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

ํšŒ์‚ฌ์—์„œ ๋ฐ์ดํ„ฐ๋ถ„์„ ์—…๋ฌด๋ฅผ ํ•จ๊ป˜ ํ•˜๋ฉด์„œ pandas๋ฅผ ํ™œ์šฉํ•ด ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋ณด์•˜๋‹ค. ๊ทธ ์ค‘์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋“ค ์œ„์ฃผ๋กœ ๊ณต์œ ํ•ด๋ณด๋ คํ•œ๋‹ค.

read_csv, to_csv

ํŒŒ์ผ์„ dataframe์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ excel๊ณผ csv ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. excel ํŒŒ์ผ์ผ ๋•Œ ๋ณดํ†ต csv ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ ํ›„ data๋ฅผ readํ•œ๋‹ค. ์ด ๋ถ€๋ถ„๋งŒ ๋ณด๋ฉด csv ํŒŒ์ผ์ด ์šฉ๋Ÿ‰์ด ๋” ์ž‘์•„์„œ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋ก  excel ํŒŒ์ผ์ด csv ํŒŒ์ผ๋ณด๋‹ค ์šฉ๋Ÿ‰์ด ๋” ์ž‘๋‹ค. ๊ทธ๋Ÿผ์—๋„ csv ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์ฒซ๋ฒˆ์งธ๋กœ csv ํŒŒ์ผ์€ plain text์ด๋ฉฐ ์ฃผ๋กœ comma๋ฅผ separate๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. excel ํŒŒ์ผ์€ microsoft excel๋กœ flexibleํ•˜์ง€ ์•Š๋‹ค. ์ฆ‰, ๊ฐ„๋‹จํ•œ text editor๋กœ๋„ ์‰ฝ๊ฒŒ ์—ด์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋‘๋ฒˆ์งธ๋Š” memory ์ด์Šˆ์ด๋‹ค. csv ํŒŒ์ผ์€ ์ ์€ memory๋ฅผ ์žก๊ธฐ ๋•Œ๋ฌธ์— csvํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ•  ๋•Œ ๋” ๋น ๋ฅด๋‹ค.

python์—์„œ csv ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ฌ ๋• read_csv๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. read_csv api์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€์˜ parameter๋“ค์ด ์žˆ์ง€๋งŒ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

import pandas as pd

csv_filename = '/Users/rimiiii/csvํŒŒ์ผ์œ„์น˜/csv_filename'

# ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ 
df = pd.read_csv(csv_filename)
  • sep: csv ํŒŒ์ผ์˜ seperator, ๋ณดํ†ต comma(,)๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋•Œ์— ๋”ฐ๋ผ ์„ธ๋ฏธ์ฝœ๋ก (;)์ด๋‚˜ tab(\t)์„ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
  • header: column์˜ ์ด๋ฆ„(header)๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 3๋ฒˆ์งธ ํ–‰์ด ์—ด์˜ ๊ธฐ์ค€์ด ๋  ๊ฒฝ์šฐ header=2๋ฅผ ์ฃผ๋ฉด ๋œ๋‹ค.
  • index_col: header์™€ ๋น„์Šทํ•œ ์—ญํ• ์ด๋‹ค. row์˜ index๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ None์œผ๋กœ index๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

ํŒŒ์ผ์„ csv ํŒŒ์ผ๋กœ ์ €์žฅํ•  ๋• to_csv๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. to_csv์—๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ parameter๊ฐ€ ์žˆ์ง€๋งŒ ์ฃผ์š”ํ•œ ๊ฒƒ๋“ค๋งŒ ๋ณด์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

# ํŒŒ์ผ ์ €์žฅํ•˜๊ธฐ
df.to_csv('์ €์žฅํ• _ํŒŒ์ผ_์œ„์น˜/์ €์žฅํ• _ํŒŒ์ผ์ด๋ฆ„.csv')
  • sep: csv ํŒŒ์ผ์„ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•  seperator์ด๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ comma(,)์ด๋‹ค.
  • header: header๋ฅผ ์ €์žฅํ• ์ง€ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ True์ด๋ฉฐ, False๋ฉด header๋ฅผ ์“ฐ์ง€ ์•Š๊ณ  list๋กœ column์ด๋ฆ„์„ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • index: index๋„ ํ•จ๊ป˜ ์ €์žฅํ• ์ง€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ True๋กœ index๋ฅผ ํ•จ๊ป˜ ์ €์žฅํ•œ๋‹ค.
  • mode: csv ํŒŒ์ผ์„ ์ €์žฅํ•  ๋•Œ w, a๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. w์˜ ๊ฒฝ์šฐ, ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๊ณ  a์˜ ๊ฒฝ์šฐ ํŒŒ์ผ์„ ๋ฎ์–ด์”Œ์šธ ์ˆ˜ ์žˆ๋‹ค. list.append์™€ ๋น„์Šทํ•œ ์—ญํ• ์ด๋‹ค.

filtering

๋ฐ์ดํ„ฐ๋ถ„์„์— ์žˆ์–ด ์›ํ•˜๋Š” ๊ฐ’๋“ค๋งŒ ์ถ”์ถœํ•˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ํ†ต๊ณ„์ง€ํ‘œ๋ฅผ ์ถ”์ถœํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๊ทธ๋•Œ ์œ ์šฉํ•œ ํ•จ์ˆ˜๋กœ filter๊ฐ€ ์žˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ํ‘œ๊ฐ€ ์žˆ์„ ๋•Œ 4000์› ์ด์ƒ์ธ menu๋“ค๋งŒ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ๋‹ค๋ฉด df.price ≥ 4000์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ํ–‰ ๋ณ„๋กœ ํ•ด๋‹น ์—ฐ์‚ฐ์ž๊ฐ€ True๋ผ๋ฉด True, False๋ผ๋ฉด False๋ฅผ ๋‚ด๋ฑ‰๋Š”๋‹ค. True์— ํ•ด๋‹นํ•˜๋Š” row๋งŒ ๋ฝ‘๊ณ  ์‹ถ๋‹ค๋ฉด df๋กœ ํ•œ๋ฒˆ ๊ฐ์‹ธ์ฃผ๋ฉด ๋œ๋‹ค.

df = pd.DataFrame({'menu': ['์•„์ด์Šค์•„๋ฉ”๋ฆฌ์นด๋…ธ', '๋ฐ€ํฌํ‹ฐ', '๋”ธ๊ธฐ๋ผ๋–ผ'], 
				'price': [3000, 4000, 5000]})
df.price >= 4000
#0    False
#1     True
#2     True
#Name: price, dtype: bool

df[df.price >= 4000]

 

๋งŒ์ผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ filtering์„ ๊ฑธ๊ณ  ์‹ถ๋‹ค๋ฉด &์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ€๊ฒฉ์ด 4000์› ์ด์ƒ์ด๊ณ  ๋”ธ๊ธฐ๋ผ๋–ผ๋ž€ menu๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ด„ํ˜ธ๊ฐ€ ์ถ”๊ฐ€๋กœ ๋“ค์–ด๊ฐ€๋Š”๋ฐ ์ˆ˜ํ•™ ์—ฐ์‚ฐ๊ณผ ๋น„์Šทํ•˜๋‹ค. ์–ด๋А ๋ถ€๋ถ„์„ ๋จผ์ € ๊ณ„์‚ฐํ• ์ง€ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

df[(df.price >= 4000) & (df.menu == '๋”ธ๊ธฐ๋ผ๋–ผ')]

์ด์™ธ์—๋„ isin์ด ์žˆ๋‹ค. ์–ด๋–ค list์— ์†ํ•œ ๊ฐ’๋“ค๋งŒ filteringํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

df[df.menu.isin(['๋”ธ๊ธฐ๋ผ๋–ผ', '์•„์ด์Šค์•„๋ฉ”๋ฆฌ์นด๋…ธ'])]

๋˜๋Š” isna()๋ฅผ ์ด์šฉํ•˜๋ฉด null๊ฐ’์˜ row๋งŒ ์ถ”์ถœํ•ด์ค€๋‹ค.

df = pd.DataFrame({'menu': ['์•„์ด์Šค์•„๋ฉ”๋ฆฌ์นด๋…ธ', '๋ฐ€ํฌํ‹ฐ', '๋”ธ๊ธฐ๋ผ๋–ผ', '๋…น์ฐจ๋ผ๋—ด'], 'price': [3000, 4000, 5000, None]})
df[df.price.isna()]

์šฐ๋ฆฌ๊ฐ€ ์ถ”์ถœํ•˜๋ ค๋Š” ํ•„ํ„ฐ๋ง์˜ ๋ฐ˜๋Œ€ row๋งŒ ๋ฝ‘๊ธฐ ์œ„ํ•ด์„  ~(๋ฌผ๊ฒฐ)์„ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค. ๋ฌผ๊ฒฐ์„ ๋„ฃ๊ฒŒ ๋˜๋ฉด True๋Š” False, False๋Š” True๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

~df.price.isna()
#0     True
#1     True
#2     True
#3    False
#Name: price, dtype: bool

df[~df.price.isna()]

groupby

์–ด๋–ค group์˜ ํ‰๊ท ๊ฐ’์„ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ๊ทธ๋Ÿด๋• groupby๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. groupby๋Š” ๊ต‰์žฅํžˆ ์œ ์šฉํ•œ api์ด๋‹ค. ๊นŠ๊ฒŒ ์•Œ์ˆ˜๋ก ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์˜ dataframe์ด ์žˆ์„ ๋•Œ shop ๋ณ„๋กœ ๊ฐ€๊ฒฉ์˜ ํ‰๊ท ์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด์„  groupby(’shop_name’).mean()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. mean ์ด์™ธ์—๋„ count, sum, var ๋“ฑ์ด ์žˆ๋‹ค.

df = pd.DataFrame({'shop_name': ['A', 'A', 'A', 'A', 'B', 'B', 'B'], 'menu': ['์•„์ด์Šค์•„๋ฉ”๋ฆฌ์นด๋…ธ', '๋ฐ€ํฌํ‹ฐ', '๋”ธ๊ธฐ๋ผ๋–ผ', '๋…น์ฐจ๋ผ๋—ด', '์•„์ด์Šค์•„๋ฉ”๋ฆฌ์นด๋…ธ', '๋ฐ€ํฌํ‹ฐ', '์นดํŽ˜๋ผ๋–ผ'], 'price': [3000, 4000, 5000, 5500, 4000, 5000, 4500]})
df.groupby('shop_name').mean()

iloc

ํŠน์ • ํ–‰๊ณผ ํŠน์ • ์—ด๋งŒ ๋ฝ‘์•„๋ณด๊ณ  ์‹ถ์„๋• list๋‚˜ array๋Š” ๋ฐ”๋กœ ๊ด„ํ˜ธ๋ฅผ ์ด์šฉํ•ด ํŠน์ • ํ–‰ ๋˜๋Š” ์—ด์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. dataframe์€ iloc์„ ์ด์šฉํ•ด์•ผํ•œ๋‹ค.

df.iloc[3] # 3๋ฒˆ์งธ ํ–‰์— ์žˆ๋Š” row ๊ฐ€์ ธ์˜ค๊ธฐ
df.iloc[3,2] #3๋ฒˆ์งธ ํ–‰, 2๋ฒˆ์งธ ์—ด์— ์žˆ๋Š” ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ

#shop_name       A
#menu         ๋…น์ฐจ๋ผ๋—ด
#price        5500
#Name: 3, dtype: object
#5500

iterrows

dataframe์„ for loop์„ ๋Œ๋ฆฌ๊ธฐ ์œ„ํ•ด์„  iterrows๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. iterrows๋Š” ํŠœํ”Œ๋กœ ๋‚ด๋ฑ‰๋Š”๋ฐ row์˜ index์™€ series ํ˜•ํƒœ์˜ row๋ฅผ ๋ฑ‰๋Š”๋‹ค.

for idx, row in df.iterrows():
	print(row['menu'])

# ์•„์ด์Šค์•„๋ฉ”๋ฆฌ์นด๋…ธ
# ๋ฐ€ํฌํ‹ฐ
# ๋”ธ๊ธฐ๋ผ๋–ผ
# ๋…น์ฐจ๋ผ๋—ด
# ์•„์ด์Šค์•„๋ฉ”๋ฆฌ์นด๋…ธ
# ๋ฐ€ํฌํ‹ฐ
# ์นดํŽ˜๋ผ๋–ผ

apply

์ด ํ•จ์ˆ˜๋„ ์ •๋ง ์œ ์šฉํ•˜๋‹ค. ํŠน์ • ์ปฌ๋Ÿผ๊ฐ’๋“ค์— ์ผ๊ด„์ ์œผ๋กœ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„๋•Œ, ์ข€ ๋” ๋ณต์žกํ•œ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ apply๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ํ•˜๋‚˜์˜ ์ปฌ๋Ÿผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ์ปฌ๋Ÿผ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. Cython iterater๋ฅผ ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์— for loop๋ณด๋‹ค ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค. ๋‹จ, dataframe์ด ๋„ˆ๋ฌด ํด ๊ฒฝ์šฐ์—๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

df.menu.apply(lambda x: x.replace('์•„์ด์Šค', '๋”ฐ๋œปํ•œ'))

# 0    ๋”ฐ๋œปํ•œ์•„๋ฉ”๋ฆฌ์นด๋…ธ
# 1         ๋ฐ€ํฌํ‹ฐ
# 2        ๋”ธ๊ธฐ๋ผ๋–ผ
# 3        ๋…น์ฐจ๋ผ๋—ด
# 4    ๋”ฐ๋œปํ•œ์•„๋ฉ”๋ฆฌ์นด๋…ธ
# 5         ๋ฐ€ํฌํ‹ฐ
# 6        ์นดํŽ˜๋ผ๋–ผ
# Name: menu, dtype: object

2๊ฐœ ์ด์ƒ์˜ ์ปฌ๋Ÿผ์„ ํ•จ๊ป˜ ๊ณ„์‚ฐํ•˜๊ณ  ์‹ถ์„๋• axis๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค. menu์— ์•„์ด์Šค๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ์Œ๋ฃŒ๋ผ๋ฉด price์— 500์›์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ปฌ๋Ÿผ์— ๋„ฃ๊ณ  ์‹ถ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

def add_ice_price(menu, price):
	return price+500 if '์•„์ด์Šค' in menu else price

df['new_price'] = df.apply(lambda x: add_ice_price(x.menu, x.price), axis=1)
df

rename

ํŠน์ • ์ปฌ๋Ÿผ๋“ค์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ์†Œ๋ฌธ์ž๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ์˜ mapper๋ฅผ ์ด์šฉํ•œ๋‹ค.

df.rename(columns={'menu': '๋ฉ”๋‰ด', 'price': '๊ฐ€๊ฒฉ'})
df.rename(str.upper, axis='columns')

์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
ยซ   2025/07   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Total
Today
Yesterday