본문 바로가기
Pandas

[Pandas] Data 다루기 (About : null data)

by moveho 2022. 10. 30.

1. NULL 값 다루기

data = [[1, np.nan, 2], [2,3,5], [np.nan,4,6]]
df = pd.DataFrame(data)
df.dropna()  #행에 null 값이 하나라도 있으면 드랍
df.dropna(axis=1)  #열에 null 값이 하나라도 있으면 드랍

해당 DATA 의 DATAFRAME

df.dropna() 행에 null값이 하나라도 있으면 행을 드랍한다.  

df.dropna (axis =1 ) 열에 null값이 하나라도 있으면 드랍한다.

 

 

여기서 정말 중요한 사실이 한가지 있다.

Pandas 에서 drop 을 제외한 모든 동작의 default 값은 행과 열중에 열 기준으로 동작하는게 기준이다

dorpna() 했을때 행이 드랍되고  조건으로 axis 를 줬을 때 해당 열이 drop 되는 건 예외적인 상황이라고 할 수 있다.

 

df['3'] = np.nan

df 라는 data frame 안에 '3' 이라는 columns 를 추가했다.

데이터는 np.nan /// nan 값으로

 

 

 

df.dropna(axis = 1, how ='all') #한 열 전체가 null 값일 때 열을 드랍

'3' columns 를 추가 했을 때 모든 값이 nan 이기 때문에 

한 열 전체가 모두 null 값이라 해당 열의 값의 모든값이 삭제되었다

 

drop은 기본 default 값이 행 작용이기 때문에 axis를 사용하여 작동을 열로 지정해 준 것이다.

 

 

df.dropna(thresh=3) #null 값이 아닌값이 원하는 갯수 이상이면 남기고 아니면 지움

null 값이 아닌 값이 원하는 갯수 이상이면 남기고 아니면 지워버린다.

즉 thresh에 준 숫자만큼의 이상 갯수가 nul 값이 아니여야 나온다.

 

 

 

2. 예제로 연습해보기

raw_data = {'first_name': ['Jason', np.nan, 'Tina', 'Jake', 'Amy'], 
        'last_name': ['Miller', np.nan, 'Ali', 'Milner', 'Cooze'], 
        'age': [42, np.nan, 36, 24, 73], 
        'sex': ['m', np.nan, 'f', 'm', 'f'], 
        'preTestScore': [4, np.nan, np.nan, 2, 3],
        'postTestScore': [25, np.nan, np.nan, 62, 70]}
df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'sex', 'preTestScore', 'postTestScore'])

 df 라는 데이터 프레임을 만들어줬다.

 df 데이터 프레임을 가지고 연습!

 

 

 

 

 

 

df.dropna()

 

 

drop은 행 기준 동작! 해당 행에 null 값이 있으면 제외하여 출력. 따라서 해당 행에 null 값이 있는 1행, 2행은 제외 되어 출력 되는 모습을 볼 수 있다.

 

df_cleaned = df.dropna(how='all')

행 전체가 null 인 행을 찾아 drop 시켰다.

전체가 null인 행은 1행

1행 전체가 없어진 모습을 볼 수 있다.

그 후 df_cleaned 라는 새로운 데이터프레임에 저장해주었다.

 

 

df['location'] = np.nan

location 이라는 새로운 columns를

추가하였다. 데이터는 모두 nan

 

 

 

 

 

df.dropna(axis=1, how='all')

해당 열이 모두 null 인 값인 경우 drop

따라서 location 열이 모두 삭제된 모습을 볼 수 있다.

 

 

df.fillna(0)

df 함수의 null 값을 모두 0으로 채워주었다.

 

df. fillna('___')

 

 

df["preTestScore"].fillna(df["preTestScore"].mean(), inplace=True)

df 함수의 PreTestScore columns의 mean 값으로 PreTestScore 의 값을 채워주는 코드이다. 기존 null 값을 제외한 mean 값은 3.0 이기 때문 3.0으로 채워졌다.

 

df.postTestScore.fillna(df.groupby('sex').postTestScore.transform('mean'), inplace=True) #성별에 따라 평균으로 채우기

'sex' 로 group by하였기 때문에 성별 mean 값으로 계산되어 기존의 null 값이 대체된다 postTestScore 값이 있던 총 여자는 1명이었기 때문에 Tina는 70점으로 그대로 대체된다.

 

df[df.age.notnull() & df.sex.notnull()]

age , sex columns에서 null 값이 없는 행 값만 출력된다. index 1번엔 null 값이 하나라도 있었기 때문에 출력되지 않는다.

댓글