๊ด€๋ฆฌ ๋ฉ”๋‰ด

ruriruriya

[Python] ํŒŒ์ด์ฌ ํŒ๋‹ค์Šค(Pandas) - NaN ๋น„์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ• ๋ณธ๋ฌธ

๐ŸPython/Pandas

[Python] ํŒŒ์ด์ฌ ํŒ๋‹ค์Šค(Pandas) - NaN ๋น„์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•

๋ฃจ๋ฆฌ์•ผใ…‘ 2023. 11. 15. 09:44
๋ฐ˜์‘ํ˜•

์‚ฌ์ง„: Unsplash ์˜ Kelly Sikkema

NaN์ด๋ž€?

NaN์€ "Not a Number"์˜ ์•ฝ์ž๋กœ, ๊ฒฐ์ธก์น˜(missing value)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํŠน์ˆ˜ํ•œ ๊ฐ’์ด๋‹ค. ์ฃผ๋กœ ํŒŒ์ด์ฌ์˜ ํŒ๋‹ค์Šค์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋„๊ตฌ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

NaN์€ ๋ฐ์ดํ„ฐ์…‹์—์„œ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ˆ˜ํ•™์ ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด๊ฒƒ์€ ๋ฐ์ดํ„ฐ์˜ ๋ถ€์žฌ, ๋ˆ„๋ฝ, ๋˜๋Š” ํŠน์ • ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•œ๋‹ค.

๋จผ์ œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ํ†ตํ•ด NaN ๋ฐ์ดํ„ฐ๋ฅผ ์•Œ์•„๋ณด์ž.

>> items2 = [{'bikes': 20, 'pants': 30, 'watches': 35, 'shirts': 15, 'shoes':8, 'suits':45},
   {'watches': 10, 'glasses': 50, 'bikes': 15, 'pants':5, 'shirts': 2, 'shoes':5, 'suits':7},
   {'bikes': 20, 'pants': 30, 'watches': 35, 'glasses': 4, 'shoes':10}]
>> df=pd.DataFrame(data= items2, index= ['store 1','store 2','store 3'])
>> df

๊ตฌ๊ธ€์ฝ”๋žฉ์—์„œ ์‹คํ–‰

NaN๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐฉ๋ฒ•

isna() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด NaN ์ด ํ•ด๋‹น๋œ ์…€์€ true๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค.

>> #๋ณ€์ˆ˜๋ช….isna
>> df.isna()

๊ฑฐ๊พธ๋กœ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด notna() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
true(๊ฐ’์ด ์žˆ๋Š” ๊ฒƒ, NaN์ด ์•„๋‹Œ ๊ฒƒ), false(๊ฐ’์ด NaN์ธ ๊ฒƒ)

>> df.notna()

๊ทธ๋ฆฌ๊ณ  ์ปฌ๋Ÿผ๋ณ„๋กœ NaN ์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด sum() ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‹คํ–‰ํ•œ๋‹ค.

>> df.isna().sum()
bikes      0
pants      0
watches    0
shirts     1
shoes      0
suits      1
glasses    1
dtype: int64

์ „์ฒด ๋ฐ์ดํ„ฐ์—์„œ NaN ์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด sum() ๋ฉ”์†Œ๋“œ๋ฅผ ํ•œ๋ฒˆ ๋” ์ถ”๊ฐ€ํ•œ๋‹ค.

>> df.isna().sum().sum()
3

 

NaN๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

1. NaN๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•

๋น„์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๋‚ด์–ด ๊ทธ ํ–‰์„ ์‚ญ์ œํ•œ๋‹ค.(๋ณดํ†ต ์—ด์„ ์‚ญ์ œํ•œ๋‹ค๊ธฐ ๋ณด๋‹จ ํ–‰์„ ์‚ญ์ œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—)

>> df.dropna()

2. ํŠน์ • ๊ฐ’์œผ๋กœ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•

NaN ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ํ–‰์„ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

NaN๋ฅผ ์ˆซ์ž๋ฅผ 0์œผ๋กœ ์ฑ„์šฐ๊ธฐ

fillna() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด NaN  ๋ฐ์ดํ„ฐ๋ฅผ 0์œผ๋กœ ์ฑ„์›Œ NaN๋ฅผ ์—†์•จ ์ˆ˜ ์žˆ๋‹ค.

>> df.fillna(0)

 

NaN๋ฅผ ๋ฌธ์ž '๋ฐ์ดํ„ฐ ์—†์Œ'์œผ๋กœ ์ฑ„์šฐ๊ธฐ

0 ๋Œ€์‹  ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์„œ ์›ํ•˜๋Š” ๋ฌธ์ž์—ด๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.

>> df.fillna('๋ฐ์ดํ„ฐ ์—†์Œ')

 

ํŠน์ • NaN ๋ฐ์ดํ„ฐ๋งŒ ๋ณ€๊ฒฝํ•˜๊ธฐ

๋งŒ์•ฝ shirts ์ปฌ๋Ÿผ์˜  NaN๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด
shirts ์ปฌ๋Ÿผ๋งŒ ์ง€์ •ํ•˜์—ฌ NaN ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

>> df['shirts'].fillna('No data')
store 1       15.0
store 2        2.0
store 3    No data
Name: shirts, dtype: object

 

์•ž์ด๋‚˜ ๋’ค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฑ„์šฐ๊ธฐ

์•ž์˜ ํ–‰์„ ๋ฐ์ดํ„ฐ๋กœ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•์€ fillna ๋ฉ”์†Œ๋“œ์˜ ffill์†์„ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  (์•ž์— f๋Š” forward)
๋’ค์˜ ํ–‰์„ ๋ฐ์ดํ„ฐ๋กœ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•์€ bfill์†์„ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค. (b๋Š” back)

axis ์†์„ฑ์€ ๊ฐ’์— ๋”ฐ๋ผ ํ–‰์—ด ๋ฐฉํ–ฅ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
axis=0: ์—ด ๋ฐฉํ–ฅ์œผ๋กœ ์ž‘๋™
axis=1: ํ–‰ ๋ฐฉํ–ฅ์œผ๋กœ ์ž‘๋™

>> df.fillna(method= 'ffill', axis=0)

 

๊ฐ ์ปฌ๋Ÿผ๋ณ„ ํ‰๊ท ๊ฐ’, ์ตœ์†Œ๊ฐ’, ์ตœ๋Œ€๊ฐ’์œผ๋กœ ์ฑ„์šฐ๊ธฐ

mean() ๋ฉ”์†Œ๋“œ๋Š” ํŒ๋‹ค์Šค์—์„œ Series๋‚˜ DataFrame์˜ ํ‰๊ท ์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” ์ฃผ์–ด์ง„ ์ถ•์„ ๋”ฐ๋ผ ํ‰๊ท ์„ ๊ณ„์‚ฐํ•œ๋‹ค.

>> df.mean()
bikes      18.333333
pants      21.666667
watches    26.666667
shirts      8.500000
shoes       7.666667
suits      26.000000
glasses    27.000000
dtype: float64
>> df.fillna(df.mean()) # ํ‰๊ท  ๊ตฌํ•œ๋‹ค์Œ์— Nan ๊ฐ’ ์ž๋™์œผ๋กœ ๋“ค์–ด๊ฐ

>> df.fillna(df.max()) #์ตœ๋Œ€๊ฐ’์œผ๋กœ ์ฑ„์šฐ๊ธฐ

>> df.fillna(df.min()) #์ตœ์†Œ๊ฐ’์œผ๋กœ ์ฑ„์šฐ๊ธฐ

๋ฐ˜์‘ํ˜•