Python/NumPy | Pandas

[Python] Pandas - DataFrame NaN 포함 행 제거

비번변경 2023. 1. 13. 20:10

개요

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