pandas 100제: 판다스 연습문제와 풀이 · 6장
051–060 결측치와 중복
isna, any, dropna, subset, fillna, 평균·그룹 평균으로 채우기, ffill, duplicated, drop_duplicates 연습문제
빈 값(NaN)과 중복 행을 다루는 전처리 문제입니다. 준비 코드의 표에는 빈 값과 중복 행이 섞여 있습니다.
준비 코드
이 장의 문제는 아래 코드를 먼저 실행한 상태에서 풉니다.
Pythonimport pandas as pd
import numpy as np
df = pd.DataFrame({
'name': ['김민준', '이서연', '박지호', '최수아', '정민서', '최수아'],
'class': ['A', 'B', 'A', 'C', 'B', 'C'],
'score': [85, np.nan, 58, 77, np.nan, 77],
'memo': ['우수', None, None, '성실', '결석', '성실'],
})
051. 열별 결측치 개수
열마다 빈 값이 몇 개인지 구하세요.
정답 보기
Pythondf.isna().sum()
결과name 0
class 0
score 2
memo 2
dtype: int64052. 결측치가 있는 행
빈 값이 하나라도 있는 행을 고르세요.
정답 보기
Pythondf[df.isna().any(axis=1)]
결과 name class score memo
1 이서연 B NaN None
2 박지호 A 58.0 None
4 정민서 B NaN 결석053. 결측치 행 지우기
빈 값이 있는 행을 모두 지우세요.
정답 보기
Pythondf.dropna()
결과 name class score memo
0 김민준 A 85.0 우수
3 최수아 C 77.0 성실
5 최수아 C 77.0 성실054. 특정 열 기준으로 지우기
score가 빈 행만 지우세요.
정답 보기
Pythondf.dropna(subset=['score'])
결과 name class score memo
0 김민준 A 85.0 우수
2 박지호 A 58.0 None
3 최수아 C 77.0 성실
5 최수아 C 77.0 성실
memo만 빈 행은 남습니다.
055. 0으로 채우기
score의 빈 값을 0으로 채운 Series를 구하세요.
정답 보기
Pythondf['score'].fillna(0)
결과0 85.0
1 0.0
2 58.0
3 77.0
4 0.0
5 77.0
Name: score, dtype: float64056. 평균으로 채우기
score의 빈 값을 평균으로 채운 Series를 구하세요.
정답 보기
Pythondf['score'].fillna(df['score'].mean())
결과0 85.00
1 74.25
2 58.00
3 77.00
4 74.25
5 77.00
Name: score, dtype: float64057. 그룹 평균으로 채우기
score의 빈 값을 같은 반의 평균으로 채우세요. 같은 반에 값이 없으면 빈 값으로 남습니다.
정답 보기
Pythondf['score'].fillna(df.groupby('class')['score'].transform('mean'))
결과0 85.0
1 NaN
2 58.0
3 77.0
4 NaN
5 77.0
Name: score, dtype: float64
transform은 그룹 결과를 원래 행 수에 맞춰 돌려줍니다. B반은 점수가 모두 비어 있어 채워지지 않습니다.
058. 앞의 값으로 채우기
memo의 빈 값을 바로 위 행의 값으로 채우세요.
정답 보기
Pythondf['memo'].ffill()
결과0 우수
1 우수
2 우수
3 성실
4 결석
5 성실
Name: memo, dtype: object059. 중복 행 찾기
앞 행과 완전히 같은 중복 행이 몇 개인지 세고, 그 행을 보이세요.
정답 보기
Pythonprint(df.duplicated().sum())
df[df.duplicated()]
결과1
name class score memo
5 최수아 C 77.0 성실060. 기준 열로 중복 지우기
name이 같은 행은 마지막 행만 남기세요.
정답 보기
Pythondf.drop_duplicates(subset='name', keep='last')
결과 name class score memo
0 김민준 A 85.0 우수
1 이서연 B NaN None
2 박지호 A 58.0 None
4 정민서 B NaN 결석
5 최수아 C 77.0 성실