๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

03-050. ์ค‘๋ณต ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

์ค‘๋ณต ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌโ€‹

์ค‘๋ณต ๋ฐ์ดํ„ฐ๋Š” ๊ฐ™์€ ์ •๋ณด๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ธฐ๋ก๋œ ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค. ์ค‘๋ณต ๋ฐ์ดํ„ฐ๋„ ํ•ด์„์„ ์™œ๊ณกํ•œ๋‹ค.

์ค‘๋ณต ๋ฐ์ดํ„ฐ ์˜ˆ์‹œ

๊ณ ๊ฐID์ด๋ฆ„๋‚˜์ด์„ฑ๋ณ„์—ฐ๋ฝ์ฒ˜
C001ํ™๊ธธ๋™35๋‚จ010-1234-5678
C002๊น€๋ฏธ์˜28์—ฌ010-9876-5432
C001ํ™๊ธธ๋™35๋‚จ010-1234-5678
C003์ด์ค€ํ˜ธ42๋‚จ010-5555-1234

์ด๋ฆ„ โ€œํ™๊ธธ๋™โ€์ด ์žˆ๋Š” ํ–‰ 2๊ฐœ๋Š” ์ค‘๋ณต์ด๋‹ค. ์ƒ์‹์ ์œผ๋กœ ๋™๋ช…์ด์ธ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฆ„์˜ ์ค‘๋ณต์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ณ ๊ฐID์™€ ์ „ํ™”๋ฒˆํ˜ธ๊นŒ์ง€ ๋™์ผํ•œ ๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ฒƒ์ด๋‹ค. ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ํ•  ๋•Œ๋Š” ์ค‘๋ณต์€ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค.

์ฝ”๋“œ

import pandas as pd

# ์˜ˆ์‹œ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
data = {
'๊ณ ๊ฐID': ['C001', 'C002', 'C001', 'C003'],
'์ด๋ฆ„': ['ํ™๊ธธ๋™', '๊น€๋ฏธ์˜', 'ํ™๊ธธ๋™', '์ด์ค€ํ˜ธ'],
'๋‚˜์ด': [35, 28, 35, 42],
'์„ฑ๋ณ„': ['๋‚จ', '์—ฌ', '๋‚จ', '๋‚จ'],
'์—ฐ๋ฝ์ฒ˜': ['010-1234-5678', '010-9876-5432', '010-1234-5678', '010-5555-1234']
}

df = pd.DataFrame(data)

print("์ค‘๋ณต ํ–‰ ๊ฐœ์ˆ˜:", df.duplicated().sum())

# ์ค‘๋ณต ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ
df_clean = df.drop_duplicates()

# ํŠน์ • ์ปฌ๋Ÿผ ๊ธฐ์ค€์œผ๋กœ ์ค‘๋ณต ์ œ๊ฑฐ
df_clean = df.drop_duplicates(subset=['๊ณ ๊ฐID'])

# ์ค‘๋ณต ๋ฐ์ดํ„ฐ ์œ ์ง€ ์˜ต์…˜ (์ฒซ ๋ฒˆ์งธ ๋˜๋Š” ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ ์œ ์ง€)
df_first = df.drop_duplicates(keep='first') # ์ฒซ ๋ฒˆ์งธ ์œ ์ง€
df_last = df.drop_duplicates(keep='last') # ๋งˆ์ง€๋ง‰ ์œ ์ง€

print("์ค‘๋ณต ์ œ๊ฑฐํ•œ ํ›„ ๊ฐœ์ˆ˜:", df_last.shape[0])
print("์ค‘๋ณต ์ œ๊ฑฐ๋œ ๋ฐ์ดํ„ฐ:")
print(df_last)

์‹คํ–‰ ๊ฒฐ๊ณผ

์ค‘๋ณต ํ–‰ ๊ฐœ์ˆ˜: 1
์ค‘๋ณต ์ œ๊ฑฐํ•œ ํ›„ ๊ฐœ์ˆ˜: 3
์ค‘๋ณต ์ œ๊ฑฐ๋œ ๋ฐ์ดํ„ฐ:
๊ณ ๊ฐID ์ด๋ฆ„ ๋‚˜์ด ์„ฑ๋ณ„ ์—ฐ๋ฝ์ฒ˜
1 C002 ๊น€๋ฏธ์˜ 28 ์—ฌ 010-9876-5432
2 C001 ํ™๊ธธ๋™ 35 ๋‚จ 010-1234-5678
3 C003 ์ด์ค€ํ˜ธ 42 ๋‚จ 010-5555-1234

Pandas์˜ duplicated() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘๋ณต๋œ ๊ฐฏ์ˆ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. drop_duplicates() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘๋ณต๋œ ํ–‰์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ค‘๋ณต์„ ํ–‰ ์ „์ฒด๋กœ ํ•˜๋Š” ๊ฒƒ์€ ์‹ค๋ฌด์—์„œ๋Š” ์ž˜ ์“ฐ์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ์˜ ํŠน์ • ์ปฌ๋Ÿผ์— ์ค‘๋ณต์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์œ„์˜ ๋ฐ์ดํ„ฐ์—์„œ๋Š” ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ค‘๋ณต์ด ๋˜๋ฉด ์•ˆ๋˜๋Š” ๊ณ ๊ฐID, ์—ฐ๋žต์ฒ˜๊ฐ€ ์ค‘๋ณต ์ฒดํฌ์˜ ๋Œ€์ƒ์ด๋‹ค. ์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” subset์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ค˜์„œ ๊ณ ๊ฐID์™€ ์—ฐ๋ฝ์ฒ˜๋ฅผ ์ค‘๋ณต ์ฒดํฌ์˜ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ ์ˆ˜๋ฅผ ๊ณ ์œ  ์›์†Œ์ˆ˜(Cardinality, ์นด๋””๋„๋ฆฌํ‹ฐ)๋ผ๊ณ  ํ•˜๋Š”๋ฐ ๋ฐ์ดํ„ฐ ๋ถ„์„๊ณผ ๊ธฐ๊ณ„ํ•™์Šต์—์„œ๋„ ์ค‘์š”ํ•˜๊ฒŒ ๋‹ค๋ฃจ๋Š” ๋ฌธ์ œ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์ค‘๋ณต์„ ์กฐ์‚ฌํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋ฉด์„œ ์ค‘๋ณต์œจ์ด ์–ผ๋งˆ์ธ์ง€ ํ™•์ธํ•ด ๋‘๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜๋‹ค.