개요
DataFrame을 저장할 때 NaN을 포함한 행은 제외하고 저장하고자 한다.
아래 데이터를 예로 들어 방법을 정리한다.
import numpy as np
import pandas as pd
import seaborn as sns
planets = sns.load_dataset('planets')
planets
데이터 확인
df.info 함수를 이용해 DataFrame에 저장된 데이터의 정보를 간단히 살펴본다. info 함수를 이용하면 객체의 타입, 인덱스 길이와 범위, column의 이름과 데이터 타입, 그리고 결측값이 아닌 데이터의 개수 등의 정보를 확인할 수 있다.
planets.info()
# 실행 결과
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1035 entries, 0 to 1034
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 method 1035 non-null object
1 number 1035 non-null int64
2 orbital_period 992 non-null float64
3 mass 513 non-null float64
4 distance 808 non-null float64
5 year 1035 non-null int64
dtypes: float64(3), int64(2), object(1)
memory usage: 48.6+ KB
행성 관련 정보가 저장된 planet 데이터세트에서 method, number, year column에는 결측값이 없고, orbital_period, mass, distance column에는 결측값이 있는 것을 알 수 있다.
dropna
결측값을 제거하는 함수다. 아래와 같은 방식으로 사용할 수 있다.
결측값이 존재하는 모든 데이터 삭제
모든 컬럼에 대해 하나라도 NaN이 있는 행을 제거하면 498개 행만 남는 것을 알 수 있다.
df = planets.dropna()
df.info()
# 실행 결과
<class 'pandas.core.frame.DataFrame'>
Int64Index: 498 entries, 0 to 784
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 method 498 non-null object
1 number 498 non-null int64
2 orbital_period 498 non-null float64
3 mass 498 non-null float64
4 distance 498 non-null float64
5 year 498 non-null int64
dtypes: float64(3), int64(2), object(1)
memory usage: 27.2+ KB
실제로 mass 컬럼이 NaN인 데이터를 대상으로 dropna을 실행하면 빈 DataFrame이 반환된다.
planets[(planets.index < 30) & (planets['mass'].isnull())]
planets[(planets.index < 30) & (planets['mass'].isnull())].dropna()
# 실행 결과
method number orbital_period mass distance year
7 Radial Velocity 1 798.50000 NaN 21.41 1996
20 Radial Velocity 5 0.73654 NaN 12.53 2011
25 Radial Velocity 1 116.68840 NaN 18.11 1996
26 Radial Velocity 1 691.90000 NaN 81.50 2012
29 Imaging 1 NaN NaN 45.52 2005
Empty DataFrame
Columns: [method, number, orbital_period, mass, distance, year]
Index: []
결측값이 존재하는 모든 열 삭제
결측값이 있는 column을 삭제할 때는 축을 지정하여 실행하면 된다.
df = planets.dropna(axis=1)
df.info()
# 실행 결과
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1035 entries, 0 to 1034
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 method 1035 non-null object
1 number 1035 non-null int64
2 year 1035 non-null int64
dtypes: int64(2), object(1)
memory usage: 24.4+ KB
특정 컬럼에 결측값이 있는 행 삭제
특정 컬럼에 결측값이 있는 행을 삭제할 때는 결측값을 확인할 컬럼 목록과 방법을 지정한다. 여러 컬럼 중 하나라도 결측값이 있는 데이터는 모두 삭제하고 싶을 때는 how를 any로, 컬럼 목록 모두 결측값이 있는 데이터를 삭제하고 싶을 때는 all로 지정한다.
df = planets.dropna(subset=['mass', 'orbital_period'], how='any')
df.info()
# 실행 결과
<class 'pandas.core.frame.DataFrame'>
Int64Index: 513 entries, 0 to 916
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 method 513 non-null object
1 number 513 non-null int64
2 orbital_period 513 non-null float64
3 mass 513 non-null float64
4 distance 498 non-null float64
5 year 513 non-null int64
dtypes: float64(3), int64(2), object(1)
memory usage: 28.1+ KB
참고 문서
[pandas] NaN 값이 있는 행 또는 열 삭제하는 방법, dropna 메소드
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.dropna.html