본문 바로가기
python/pandas

pandas - 비어있는 데이터(NaN) 확인 및 처리하는 방법'method=' ' ffill ' ' bfill '

by leo104 2022. 11. 24.
728x90

- 데이터프레임에서 비어있는 데이터가 어디에 , 몇개 있는지 확인하는 방법

- .isna( ) =>>비어있는 데이터 확인

- .isna( ) .sum( ) =>>컬럼별로 비어있는 데이터 개수

- ..isna( ) .sum( ).sum( ) =>> 전체 데이터 중에 비어있는 데이터 개수

df = df = pd.DataFrame(data= items2, index=['store 1', 'store 2' , 'store 3' ])

df

bikes	pants	watches	shirts	shoes	suits	glasses
store 1	20	30	35	15.0	8	45.0	NaN
store 2	15	5	10	2.0	5	7.0	50.0
store 3	20	30	35	NaN	10	NaN	4.0

비어있는 데이터 확인

df.isna( )


        bikes	pants	watches	shirts	shoes	suits	glasses
store 1	False	False	False	False	False	False	True
store 2	False	False	False	False	False	False	False
store 3	False	False	False	True	False	True	False

비어있는 데이터가 컬럼별로 몇개 있는지 확인

df.isna().sum()

bikes      0
pants      0
watches    0
shirts     1
shoes      0
suits      1
glasses    1
dtype: int64

전체 데이터에서 비어있는 데이터가 몇개 있는지 확인

df.isna().sum().sum()

3

 

NaN을 처리하는 전략

 

1. 삭제하는 전략

- .dropna( ) 를 이용해서 비어있는 데이터의 행을 삭제한다.

df

	bikes	pants	watches	shirts	shoes	suits	glasses
store 1	20	30	35	15.0	8	45.0	NaN
store 2	15	5	10	2.0	5	7.0	50.0
store 3	20	30	35	NaN	10	NaN	4.0

df.dropna( )

	bikes	pants	watches	shirts	shoes	suits	glasses
store 2	15	5	10	2.0	5	7.0	50.0

# NaN 데이터가 있는 행이 삭제된다.

 

2. 특정 값으로 채우는 전략

- .fillna( ) 를 이용해서 비어있는 데이터를 채운다.

df

     bikes	pants	watches	shirts	shoes	suits	glasses
store 1	20	30	35	15.0	8	45.0	NaN
store 2	15	5	10	2.0	5	7.0	50.0
store 3	20	30	35	NaN	10	NaN	4.0

# df에서 비어있는 행에 100을 채워라

df.fillna( 100 )

      bikes	pants	watches	shirts	shoes	suits	glasses
store 1	20	30	35	15.0	8	45.0	100.0
store 2	15	5	10	2.0	5	7.0	50.0
store 3	20	30	35	100.0	10	100.0	4.0

 

2번 전략의 예시 )

- 데이터의 컬럼을 가져와서 비어있는 데이터를 채우는 함수 .fillna( )를 이용한다.

- 컬럼의 개수가 여러개라면  리스트로 묶어서 표기한다.

# shirts 데이터의 비어있는 부분은 0으로 채운다.

df


      bikes	pants	watches	shirts	shoes	suits	glasses
store 1	20	30	35	15.0	8	45.0	NaN
store 2	15	5	10	2.0	5	7.0	50.0
store 3	20	30	35	NaN	10	NaN	4.0

df = df['shirts'].fillna(0)

df
	
    bikes	pants	watches	shirts	shoes	suits	glasses
store 1	20	30	35	15.0	8	45.0	NaN
store 2	15	5	10	2.0	5	7.0	50.0
store 3	20	30	35	0.0	10	NaN	4.0

# suits와 glasses의 비어있는 데이터는 100으로 채운다.

df

	bikes	pants	watches	shirts	shoes	suits	glasses
store 1	20	30	35	15.0	8	45.0	NaN
store 2	15	5	10	2.0	5	7.0	50.0
store 3	20	30	35	NaN	10	NaN	4.0

df[['suits', 'glasses']] = df[['suits', 'glasses']].fillna(100)

df


     bikes	pants	watches	shirts	shoes	suits	glasses
store 1	20	30	35	15.0	8	45.0	100.0
store 2	15	5	10	2.0	5	7.0	50.0
store 3	20	30	35	0.0	10	100.0	4.0

 

3. 위, 아래 행 과 왼쪽, 오른쪽 열로 비어있는 데이터를 채우는 전략

 

- method= 를 사용하여 채운다. 앞의 데이터를 가져오려면 'ffill',  뒤의 데이터를 가져오려면  'bfill'을 이용한다.

- 그리고 그 후에 axis = 0 or 1로 행인지 열인지 지정해준다.

- 행에서의 앞은 위의 데이터 뒤는 아래의 데이터, 열에서의 앞은 왼쪽, 뒤는 뒤쪽을 뜻한다.

- 변수. fillna(method = 'ffill' or 'bfill' , axis = 0 or1)

# 비어있는 데이터의 위 행의 데이터를 갖고와서 비어있는 데이터를 채우는 방법

df

      bikes	pants	watches	shirts	shoes	suits	glasses
store 1	20	30	35	15.0	8	45.0	NaN
store 2	15	5	10	2.0	5	7.0	50.0
store 3	20	30	35	NaN	10	NaN	4.0

df = df.fillna(method= 'ffill' , axis = 0)

df

      bikes	pants	watches	shirts	shoes	suits	glasses
store 1	20	30	35	15.0	8	45.0	100.0
store 2	15	5	10	2.0	5	7.0	50.0
store 3	20	30	35	0.0	10	100.0	4.0

# 비어있는 데이터의 아래 행의 데이터를 갖고와서 비어있는 데이터를 채우는 방법

df = df.fillna(method= 'bfill' , axis = 0)

	  bikes	pants	watches	shirts	shoes	suits	glasses
store 1	20	30	35	15.0	8	45.0	50.0
store 2	15	5	10	2.0	5	7.0	50.0
store 3	20	30	35	2.0	10	7.0	4.0

# 비어있는 데이터의 왼쪽 열의 데이터를 갖고와서 비어있는 데이터를 채우는 방법

df.fillna(method='ffill', axis = 1 )

	bikes	pants	watches	shirts	shoes	suits	glasses
store 1	20.0	30.0	35.0	15.0	8.0	45.0	45.0
store 2	15.0	5.0	10.0	2.0	5.0	7.0	50.0
store 3	20.0	30.0	35.0	35.0	10.0	10.0	4.0

# 비어있는 데이터의 오른쪽 열의 데이터를 갖고와서 비어있는 데이터를 채우는 방법

df.fillna(method= 'bfill', axis = 1)


        bikes	pants	watches	shirts	shoes	suits	glasses
store 1	20.0	30.0	35.0	15.0	8.0	45.0	NaN
store 2	15.0	5.0	10.0	2.0	5.0	7.0	50.0
store 3	20.0	30.0	35.0	10.0	10.0	4.0	4.0

 

4. 비어있는 데이터를 컬럼의 평균, 최댓값, 최솟값 등등 으로 채우기

# 비어있는 데이터를 컬럼의 최댓값으로 채우기

df.fillna(df.mean())

	bikes	pants	watches	shirts	shoes	suits	glasses
store 1	20	30	35	15.0	8	45.0	50.0
store 2	15	5	10	2.0	5	7.0	50.0
store 3	20	30	35	15.0	10	45.0	4.0

# 비어있는 데이터를 컬럼의 최댓값으로 채우기

df.fillna(df.mean()) 

bikes	pants	watches	shirts	shoes	suits	glasses
store 1	20	30	35	15.0	8	45.0	100.0
store 2	15	5	10	2.0	5	7.0	50.0
store 3	20	30	35	0.0	10	100.0	4.0

max, mean, std, medianm 등등 으로 다양하게 채울 수 있다.

 

* 데이터가 채워져있는지 물어보는 함수

- .notna( )를 사용한다.

df.notna()

	bikes	pants	watches	shirts	shoes	suits	glasses
store 1	True	True	True	True	True	True	True
store 2	True	True	True	True	True	True	True
store 3	True	True	True	True	True	True	True
728x90