02단계 · 표 다루기 (pandas)
결측치 세고 채우고 버리기
`isnull().sum()`, `fillna`, `dropna(subset=...)` 를 구분해서 쓴다.
먼저 알아볼게요
코드로 이동 ↓빈 칸은 NaN 으로 들어온다. df.isnull() 은 칸마다 True/False 를 만들고, .sum() 을 붙이면 열별 개수가 나온다. 한 번 더 .sum() 하면 전체 개수다.
df["열"].fillna(값) 은 빈 칸을 그 값으로 채운다. 결과를 다시 담아야 표가 바뀐다: df["열"] = df["열"].fillna(값).
평균으로 채울 때는 먼저 평균을 변수에 담아 둔다. 평균으로 채워도 평균 자체는 그대로다(부동소수 오차 제외) — 빠진 자리에 평균을 넣었으니 그렇다. 변수에 담는 이유는 값이 달라져서가 아니라, 중앙값 같은 다른 값으로 바꿔 채우거나 2유형에서 평가 데이터에도 같은 값을 써야 할 때 그 값이 남아 있어야 하기 때문이다. 아래 예시의 [1, 3, NaN] 이 채우기 전후로 모두 평균 2.0 인 것을 확인해 보라.
df.dropna() 는 빈 칸이 하나라도 있는 행을 전부 버린다. 특정 열만 기준으로 하려면 dropna(subset=["근속연수"]) 처럼 적는다. 발문이 "해당 직원 삭제" 라고 하면 이 모양이다.
채우기와 버리기 중 무엇을 고르느냐에 따라 답이 달라진다. 발문이 시킨 대로만 해야 하고, 시키지 않은 처리를 덧붙이면 틀린다.
import pandas as pd
df = pd.read_csv("emp.csv")
print(df.isnull().sum())
print(df.shape[0], df.dropna().shape[0])
s = pd.Series([1, 3, None])
print(s.mean(), s.fillna(s.mean()).mean())fillna 는 결과를 다시 담아야 반영된다. 평균으로 채우면 평균은 그대로다. 다른 방법은 데이터에 따라 평균을 바꿀 수 있다.
emp.csv 에서 ① 전체 결측치 개수 ② 고객만족도 의 결측치 개수 ③ 고객만족도 평균(소수 넷째 자리) ④ 그 평균으로 채운 뒤 남은 결측치 개수 ⑤ 근속연수 가 빈 행만 버렸을 때의 행 수를 출력하세요.
제공 파일 1개 · 내용 보기
파일은 준비되어 있어요. 코드에서 이름으로 불러오세요.
사번,이름,부서,직급,연봉,근속연수,고객만족도,입사일 1001,김서준,인사,사원,3230,2,3.8,2024-08-28 1002,이지우,인사,사원,4083,3,4.2,2023-07-26 1003,박도윤,인사,사원,3222,1,3.4,2025-09-24 1004,최하은,지원,부장,7395,18,4.6,2008-06-09 1005,정예준,영업,부장,8075,17,,2009-05-20 1006,강수아,인사,부장,7466,18,4.7,2008-06-01 1007,조민준,지원,대리,4558,5,4.7,2021-01-28 1008,윤지아,영업,과장,5796,,4.6,2015-04-13 1009,장시우,지원,과장,5878,13,4.6,2013-12-15 1010,임하윤,지원,대리,4686,9,3.3,2017-05-19 1011,한도현,지원,부장,7426,20,4.3,2006-07-27 1012,오채원,영업,사원,3545,4,,2022-06-25 1013,신건우,영업,사원,3724,1,3.8,2025-02-19 1014,권서연,영업,대리,4327,7,3.2,2019-05-06 1015,황준서,개발,부장,7732,21,4.7,2005-05-13 1016,안다은,영업,사원,3823,4,4.2,2022-01-13 1017,송지호,개발,부장,7262,19,4.4,2007-07-27 1018,전유진,지원,과장,6006,15,3.6,2011-03-16 1019,홍현우,개발,과장,5806,14,4.7,2012-10-17 1020,문소율,지원,사원,4008,,3.2,2023-01-06 1021,양지훈,개발,부장,7754,13,3.4,2013-07-10 1022,배가은,개발,과장,5483,13,3.4,2013-03-21 1023,백태윤,지원,사원,3510,4,4.1,2022-10-07 1024,유서윤,인사,사원,3477,2,,2024-06-22 1025,남주원,지원,사원,3581,1,3.3,2025-06-12 1026,노예린,영업,대리,4410,4,4.9,2022-06-04 1027,하시윤,지원,부장,7820,21,3.6,2005-04-15 1028,구다인,인사,사원,3846,1,3.2,2025-11-08 1029,서준혁,인사,대리,4549,4,3.2,2022-06-24 1030,민하율,개발,부장,7903,15,3.2,2011-12-03
들여쓰기: Tab · 편집기에서 나가기: Esc 다음 Tab
실행 결과
실행하면 코드가 출력한 내용이 여기에 나타나요.
막혔을 때
풀이와 비교하기
내 코드와 한 줄씩 비교해 보세요. 풀이를 보는 것만으로 완료되지는 않아요.
import pandas as pd
df = pd.read_csv("emp.csv")
print(df.isnull().sum().sum())
print(df["고객만족도"].isnull().sum())
m = df["고객만족도"].mean()
print(round(m, 4))
df["고객만족도"] = df["고객만족도"].fillna(m)
print(df["고객만족도"].isnull().sum())
print(df.dropna(subset=["근속연수"]).shape[0])