Python/Pandas

[pandas] 데이터 전처리

노트북 산 김에 공부 2023. 3. 20. 09:10

[pandas] 데이터프레임 (DataFrame)[pandas] pivot_table, groupby로 이어지는 내용입니다.

특히 '[pandas] 데이터프레임 (DataFrame)' 을 꼭 숙지하시기 바랍니다

사용 데이터 : http://bit.ly/ds-korean-idol


Null 값 처리

Null값은 데이터를 처리할 때 반드시 처리해야(수정, 제거...) 하는 값입니다.

심지어 Null의 개념을 만들어낸 당사지도 '몇십 억짜리 실수'라고 할 정도입니다.

 

Null값 확인

 

.isna().isnull() 매서드를 활용해 Null값의 여부를 확인할 수 있습니다.

df.isna()
df.isnull()

위처럼 Null값인 데이터를 True로 색인시킵니다.

만일 Null값이 몇 개인지 확인하려면  .isnull( ).sum( )을 하면 됩니다.

 

이와 상반되게 .notnull( )은 Null값이 없는 데이터를 True로 색인시킵니다.

df.notnull()

 

.fillna( ) - Null값 대체

 

.fillna( )는 Null값을 다른 데이터로 바꿔주는 함수입니다

위에서 Null값을 찾았을 때 '키' 속성이 가장 결측치가 많았기 때문에 '키'의 Null값을 바꿔보겠습니다.

# 적용할 속성만 선택해야한다  	  # inplace로 저장
df['키'].fillna(df['키'].mean(), inplace = True)
		     # 집계함수 사용

기존에 Null 값이였던 7번과 10번의 '키' 값이 전체 '키'의 평균이 되었습니다.

df.fillna( )로 하면 df의 모든 Null값에 적용되기 때문에 적용할 속성명을 df[' '] 안에 쓰고 fillna()를 사용해야합니다.

 

.dropna( how = 'all' 'any',   axis = 0,1 )

Null값을 바꾸는 것 말고도 제거하는 것도 가능합니다 (추천하지는 않습니다)

how에 'all'은 튜플값 전체가 Null이면 제거 / 'any'는 튜플값 중 하나라도 Null이면 제거.

axis에 0은 행을 제거 1은 열을 제거.

        # Null 하나라도 있으면 제거
df.dropna(how = 'any', axis = 0) # 행 제거


type 변환

기본적으로 DataFrame의 type은 <class 'pandas.core.frame.DataFrame'> 이지만.

DafaFrame 안에 들어있는 데이터 값은 속성마다 다를 수 있습니다.

속성별 데이터 타입을 보려면 .dtypes를 사용합니다.

 

dtypes
df.dtypes

 

.astype( ) - 타입 변경
타입을 변경하려면 NaN값이 들어있으면 안된다 ▶ fillna로 바꿔라

 

이미 위에서 '키'의 Null값을 제거했으니 바로 타입을 바꿔보겠습니다.

df['키'].astype(int)

기존의 float였던 '키'값이 정수형인 int로 바뀌었습니다. dtypes로 확인해보세요

 

datetime 날자 변환

현재 '생년월일' 속성은 날짜를 나타내고 있습니다. 그러나 object, 즉 문자열 타입으로 이루어져 있습니다.

이를 datetime 타입으로 변경해보겠습니다.

 

pd.to_datetime( )

 

pd.to_datetime( df [ '날짜속성명' ] ) 

# 값을 적용시키기 위해 앞에 df[] =
df['생년월일'] = pd.to_datetime(df['생년월일'])

따로 년/월/일 정보를 추출해서 열을 추가할  수 있다. ( from pandas import datetime as dt를 해야 원활하게 됩니다 )

datetime에서 년/월/일 을 따로 추출하려면 .dt.(year, month, day)를 하면 됩니다.

# 열 추가
df['년'] = df['생년월일'].dt.year
df['월'] = df['생년월일'].dt.month
df['일'] = df['생년월일'].dt.day
# 출력
df.loc[0:7,['이름','년','월','일']]


중복 값 처리

 drop_duplicates( ) 를 활용해 중복된 값을 처리할 수 있습니다.

( keep = 삭제순서)를 넣어 유지하고 싶은 데이터를 선택할 수 있습니다 (안 넣으면 자동으로 first가 됩니다)

keep = 'first' 는 중복 첫번째 값을 유지합니다 / keep = 'last' 는 중복 마지막 값을 유지합니다.

 

.droup_duplicates( )
df.drop_duplicates('소속사', keep = 'first')
# 중복 마지막 값을 살릴려면 keep = 'last'
#      첫번째 값을 살릴려면 keep = 'first'

소속사 값에 고유값만 보이지요?


apply lambda 식으로 데이터 가공

lambda는 함수의 선언과 처리를 한줄의 식으로 쉽게 작성할 수 있습니다.

pandas는 apply( ) 함수와 lambda 식을 결합해 DataFrame과 Series의 데이터를 빠르게 가공하는 기능을 제공합니다.

 

빠르게 lambda를 정리해 보겠습니다.

lambda 매게변수 : return 값

lambda 매게변수 : 값1 if.... else 값2 

# 기존 함수
def get_s(a):
  if a % 2 == 0:
    return '짝수'
  else:
    return '홀수'
print(f'5는 {get_s(5)}')

# lambda 
lambda_s = lambda a : '짝수' if a % 2 == 0 else '홀수'
print(f'5는 {lambda_s(5)}')

 

.apply( lambda )

 

apply는 Series나 DataFrame에 좀 더 구체적인 로직을 적용하고 싶은 경우 활용합니다.

성별 값을 남자는 1, 여자는 0으로 바꿔보겠습니다.

fun = lambda sex : 1 if sex =='남자' else 0
df['성별'] = df['성별'].apply(fun)

 

'Python > Pandas' 카테고리의 다른 글

[pandas] pivot_table, groupby  (0) 2023.03.19
[pandas] 데이터프레임 (DataFrame)  (0) 2023.03.13