달나라 노트

Python Pandas : dropna (NaN value가 있는 row/column 제거하기) 본문

Python/Python Pandas

Python Pandas : dropna (NaN value가 있는 row/column 제거하기)

CosmosProject 2021. 6. 8. 17:02
728x90
반응형

 

 

 

 

 

dropna function은 DataFrame에서 NaN value가 존재하는 행(row) 또는 열(column)을 제거해줍니다.

 

 

 

 

 

 

dropna의 syntax는 다음과 같습니다.

DataFrame.dropna(axis=0/1, how='any'/'all', subset=[col1, col2, ...], inplace=True/False)

dropna에 들어갈 수 있는 parameter들은 더 많지만 일단 대표적인 것들만 보겠습니다.

 

axis = 0/1 or 'index'/'columns'

0 or 'index' -> NaN 값이 포함된 row를 drop (default 값입니다.)

1 or 'columns' -> NaN 값이 포함된 column을 drop

 

 

how = 'any'/'all'

any -> row 또는 column에 NaN값이 1개만 있어도 drop (default 값입니다.)

all -> row 또는 column에 있는 모든 값이 NaN이어야 drop

 

 

inplace = True/False

True -> dropna가 적용된 DataFrame 자체에 dropna를 적용

False -> dropna가 적용된 DataFrame는 그대로 두고 dropna를 적용한 DataFrame을 return

 

 

subset = [col1, col2, ...]

subset을 명시하지 않으면 DataFrame 전체(모든 column & 모든 row)에 대해 dropna를 진행

subset을 명시하면 subset에 적힌 column값에 대해서만 dropna를 진행

 

 

 

dropna에 대한 문서는 아래 링크입니다.

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html

 

pandas.DataFrame.dropna — pandas 1.2.4 documentation

Determine if rows or columns which contain missing values are removed. Changed in version 1.0.0: Pass tuple or list to drop on multiple axes. Only a single axis is allowed.

pandas.pydata.org

 

 

 

 

 

 

 

 

먼저 test용 DataFrame을 만듭시다.

 

import pandas as pd
import numpy as np

dict_test = {
    'col1': [1, 2, 3, 4, 5],
    'col2': ['a', 'b', np.nan, 'd', 'e'],
    'col3': [np.nan, 1, 2, 3, 4]
}

df_test = pd.DataFrame(dict_test)
print(df_test)



-- Result
   col1 col2  col3
0     1    a   NaN
1     2    b   1.0
2     3  NaN   2.0
3     4    d   3.0
4     5    e   4.0

 

 

 

 

 

 

 

 

import pandas as pd
import numpy as np

dict_test = {
    'col1': [1, 2, 3, 4, 5],
    'col2': ['a', 'b', np.nan, 'd', 'e'],
    'col3': [np.nan, 1, 2, 3, 4]
}

df_test = pd.DataFrame(dict_test)
print(df_test)

df_result = df_test.dropna(axis=0, inplace=False)
print(df_result)

df_result = df_test.dropna(axis='index', inplace=False)
print(df_result)


-- Result
   col1 col2  col3
0     1    a   NaN
1     2    b   1.0
2     3  NaN   2.0
3     4    d   3.0
4     5    e   4.0

   col1 col2  col3
1     2    b   1.0
3     4    d   3.0
4     5    e   4.0

   col1 col2  col3
1     2    b   1.0
3     4    d   3.0
4     5    e   4.0

 

위 예시는 axis = 0 or 'index'로 설정된 경우의 예시입니다.

DataFrame의 index = 0, index = 2인 row에 NaN값이 1개씩 포함되어있죠.

따라서 index = 0, index = 2인 row가 삭제되고 그 외의 row들만 return되었습니다.

 

 

 

 

 

 

 

 

 

import pandas as pd
import numpy as np

dict_test = {
    'col1': [1, 2, 3, 4, 5],
    'col2': ['a', 'b', np.nan, 'd', 'e'],
    'col3': [np.nan, 1, 2, 3, 4]
}

df_test = pd.DataFrame(dict_test)
print(df_test)

df_result = df_test.dropna(axis=1, inplace=False)
print(df_result)

df_result = df_test.dropna(axis='columns', inplace=False)
print(df_result)


-- Result
   col1 col2  col3
0     1    a   NaN
1     2    b   1.0
2     3  NaN   2.0
3     4    d   3.0
4     5    e   4.0

   col1
0     1
1     2
2     3
3     4
4     5

   col1
0     1
1     2
2     3
3     4
4     5

 

위 예시는 axis = 1 or 'columns'로 설정된 경우의 예시입니다.

col2, col3에 NaN값이 1개씩 포함되어있으니 col2, col3가 모두 drop되고 결과에는 col1만 남아있죠.

 

 

 

 

 

 

import pandas as pd
import numpy as np

dict_test = {
    'col1': [1, np.nan, 3, 4, 5],
    'col2': [np.nan, np.nan, np.nan, np.nan,np.nan],
    'col3': [0, np.nan, 2, 3, 4]
}

df_test = pd.DataFrame(dict_test)
print(df_test)

df_result = df_test.dropna(axis=0, how='all', inplace=False)
print(df_result)



-- Result
   col1  col2  col3
0   1.0   NaN   0.0
1   NaN   NaN   NaN
2   3.0   NaN   2.0
3   4.0   NaN   3.0
4   5.0   NaN   4.0

   col1  col2  col3
0   1.0   NaN   0.0
2   3.0   NaN   2.0
3   4.0   NaN   3.0
4   5.0   NaN   4.0

 

위 예시의 dropna를 해석해보면 다음과 같습니다.

axis = 0 -> NaN값이 있는 row를 drop함

how = 'all' -> row 전체가 NaN값이어야만 drop함.

 

따라서 모든 값이 NaN인 index = 1인 row만 drop되고

나머지 row는 그대로 return되었습니다.

 

 

 

 

 

 

 

 

import pandas as pd
import numpy as np

dict_test = {
    'col1': [1, np.nan, 3, 4, 5],
    'col2': [np.nan, np.nan, np.nan, np.nan,np.nan],
    'col3': [0, np.nan, 2, 3, 4]
}

df_test = pd.DataFrame(dict_test)
print(df_test)

df_result = df_test.dropna(axis=1, how='all', inplace=False)
print(df_result)



-- Result
   col1  col2  col3
0   1.0   NaN   0.0
1   NaN   NaN   NaN
2   3.0   NaN   2.0
3   4.0   NaN   3.0
4   5.0   NaN   4.0

   col1  col3
0   1.0   0.0
1   NaN   NaN
2   3.0   2.0
3   4.0   3.0
4   5.0   4.0

 

위 예시의 dropna를 해석해보면 다음과 같습니다.

axis = 1 -> NaN값이 있는 column을 drop함

how = 'all' -> column 전체가 NaN값이어야만 drop함.

 

따라서 모든 값이 NaN인 col2만 drop되고

나머지 column은 그대로 return되었습니다.

 

 

 

 

 

import pandas as pd
import numpy as np

dict_test = {
    'col1': [1, 2, 3, 4, 5],
    'col2': ['a', 'b', np.nan, 'd', 'e'],
    'col3': [np.nan, 1, 2, 3, 4]
}

df_test = pd.DataFrame(dict_test)
print(df_test)

df_result = df_test.dropna(axis=0, subset=['col1', 'col2'], inplace=False)
print(df_result)



-- Result
   col1 col2  col3
0     1    a   NaN
1     2    b   1.0
2     3  NaN   2.0
3     4    d   3.0
4     5    e   4.0

   col1 col2  col3
0     1    a   NaN
1     2    b   1.0
3     4    d   3.0
4     5    e   4.0

위 예시는 subset에 col1, col2를 명시하였고,

따라서 col1, col2에서만 dropna를 진행합니다.

(col3의 index = 0에 NaN값이 있는데 index=0인 row는 drop되지 않았습니다.)

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
Comments