pandas 100제: 판다스 연습문제와 풀이 · 6장

051–060 결측치와 중복

isna, any, dropna, subset, fillna, 평균·그룹 평균으로 채우기, ffill, duplicated, drop_duplicates 연습문제

3분 읽기

빈 값(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: int64

052. 결측치가 있는 행

빈 값이 하나라도 있는 행을 고르세요.

정답 보기
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: float64

056. 평균으로 채우기

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: float64

057. 그룹 평균으로 채우기

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: object

059. 중복 행 찾기

앞 행과 완전히 같은 중복 행이 몇 개인지 세고, 그 행을 보이세요.

정답 보기
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  성실

전체 메뉴