Updated:

import pandas as pd
import numpy as np

msg = "{}:\n{}\n"

1. NaN Data 찾기

  • df.info(): 각 column별로 not-null인 Data의 갯수를 반환한다.
  • df.isna(): 각 data가 NaN인지 아닌지 True, False로 반환한다.
  • df.isnull(): 각 data가 NaN인지 아닌지 True, False로 반환한다.

df.isna()와 df.isnull()는 이름만 차이가 있을뿐 똑같이 동작한다.

둘의 이름이 다른 이유는 Pandas의 DataFrame이 R을 기반으로 해서 그렇다.

참고를 확인해보면 R에서는 na와 null이 다른 것이지만 NumPy를 기반으로 한 Python Library에서는 na와 null을 가지고 있지않고 대신 NaN을 사용하기 때문에 이름이 달라진 것이라고 설명이 되어있다.

data = np.random.randint(1,100,(4,4))
added = np.array([0,1,np.nan,np.nan]).reshape(-1,1)
new_data = np.hstack([data,added])

df = pd.DataFrame(new_data,index = list('abcd'), columns=['col ' + str(i) for i in range(1,6)])
print(msg.format("df",df))

print(msg.format("df.info()",df.info()))
print(msg.format("df.isna()",df.isna()))
print(msg.format("df.isnull()",df.isnull()))
df:
   col 1  col 2  col 3  col 4  col 5
a   93.0   35.0   55.0   35.0    0.0
b   52.0   16.0   39.0   71.0    1.0
c   18.0   25.0   39.0   96.0    NaN
d   14.0   42.0   16.0   44.0    NaN

<class 'pandas.core.frame.DataFrame'>
Index: 4 entries, a to d
Data columns (total 5 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   col 1   4 non-null      float64
 1   col 2   4 non-null      float64
 2   col 3   4 non-null      float64
 3   col 4   4 non-null      float64
 4   col 5   2 non-null      float64
dtypes: float64(5)
memory usage: 192.0+ bytes
df.info():
None

df.isna():
   col 1  col 2  col 3  col 4  col 5
a  False  False  False  False  False
b  False  False  False  False  False
c  False  False  False  False   True
d  False  False  False  False   True

df.isnull():
   col 1  col 2  col 3  col 4  col 5
a  False  False  False  False  False
b  False  False  False  False  False
c  False  False  False  False   True
d  False  False  False  False   True

2. NaN값 drop하기

df.dropna(axis=0,how=’any’)

  • axis=0(default)이면 NaN값이 있는 row를 axis=1이면 NaN이 있는 column을 drop한다.
  • how: ‘any’(default)이면 하나라도 NaN이면 drop, ‘all’이면 그 row나 column의 모든 value가 NaN이면 drop한다.
data = np.random.randint(1,100,(4,4))
added = np.array([0,1,np.nan,np.nan]).reshape(-1,1)
new_data = np.hstack([data,added])

df = pd.DataFrame(new_data,index = list('abcd'), columns=['col ' + str(i) for i in range(1,6)])
print(msg.format("df",df))

print(msg.format("df.dropna()",df.dropna()))
print(msg.format("df.dropna(how='all')",df.dropna(how='all')))

print(msg.format("df.dropna(axis=1)",df.dropna(axis=1)))
df:
   col 1  col 2  col 3  col 4  col 5
a   22.0   91.0   68.0   27.0    0.0
b   88.0   73.0   68.0   54.0    1.0
c   40.0   32.0   31.0   17.0    NaN
d   37.0   82.0   85.0   72.0    NaN

df.dropna():
   col 1  col 2  col 3  col 4  col 5
a   22.0   91.0   68.0   27.0    0.0
b   88.0   73.0   68.0   54.0    1.0

df.dropna(how='all'):
   col 1  col 2  col 3  col 4  col 5
a   22.0   91.0   68.0   27.0    0.0
b   88.0   73.0   68.0   54.0    1.0
c   40.0   32.0   31.0   17.0    NaN
d   37.0   82.0   85.0   72.0    NaN

df.dropna(axis=1):
   col 1  col 2  col 3  col 4
a   22.0   91.0   68.0   27.0
b   88.0   73.0   68.0   54.0
c   40.0   32.0   31.0   17.0
d   37.0   82.0   85.0   72.0

3. NaN을 다른 값으로 바꾸기 (채워넣기)

df.fillna(value): NaN이 value로 채워진다.

data = np.random.randint(1,100,(4,4))
added = np.array([0,1,np.nan,np.nan]).reshape(-1,1)
new_data = np.hstack([data,added])

df = pd.DataFrame(new_data,index = list('abcd'), columns=['col ' + str(i) for i in range(1,6)])
print(msg.format("df",df))

print(msg.format("df.fillna(100)",df.fillna(100)))
df:
   col 1  col 2  col 3  col 4  col 5
a   12.0   80.0   68.0   74.0    0.0
b   14.0   86.0   94.0   95.0    1.0
c   74.0    1.0   18.0   84.0    NaN
d   22.0   90.0   80.0   54.0    NaN

df.fillna(100):
   col 1  col 2  col 3  col 4  col 5
a   12.0   80.0   68.0   74.0    0.0
b   14.0   86.0   94.0   95.0    1.0
c   74.0    1.0   18.0   84.0  100.0
d   22.0   90.0   80.0   54.0  100.0

Leave a comment