본문 바로가기

Skill Sets/Python

[python/pandas] 판다스(pandas) 활용한 데이터 전처리(3)

SMALL

안녕하세요! 데코입니다!

오늘은 빅데이터분석기사(빅분기) 실기를 공부하면서

알아두면 좋을 데이터 전처리에 대하여 포스팅하려고 합니다!

(출처 : https://www.datamanim.com/dataset/99_pandas/pandasMain.html)

 

출처에 있는 "1.2 데이터 전처리 100문제"를 python과 pandas를 활용해 풀면서

제가 잘 활용 안 하던 전처리 내용을 설명하려고 해요!

바로 시작하겠습니다! :)


# 7. dataframe에서  특정 단어로 시작하는 데이터 추출하기

DataFrame에서 특정 단어로 시작하는 값을 조회하는 경우가 있어요!

sql에서 작성을 하는 경우에는 WHERE 문에 LIKE를 활용해서 원하는 데이터를 조회합니다!

 

Pandas의 DataFrame에서는 2가지 방법을 이용해서

특정 단어로 시작하는 데이터만을 조회할 수 있습니다!

 

제가 문제를 보고 처음에 생각을 한 것은 apply문을 통해 시작이 'N'인 것만을 가져오도록 코드를 작성했는데,

 

정답을 확인하니까, 정답에 나와 있는 코드가 더 간결하고 직관적이더라고요! 

# 데이터 불러오기
DataUrl = 'https://raw.githubusercontent.com/Datamanim/pandas/main/chipo.csv'
DF = pd.read_csv(DataUrl)

# [41-1] df의 데이터 중 item_name 값이 N으로 시작하는 데이터를 모두 추출하라.
DF[DF['item_name'].apply(lambda x : str(x)[0]=='N')]

# [41-2] df의 데이터 중 item_name 값이 N으로 시작하는 데이터를 모두 추출하라.
DF[DF.item_name.str.startswith('N')]

 

[41-1]과 [41-2]의 출력 결과는 아래와 같이 나와요!

 

 

[41-1] 코드에 대하여 설명을 하면,

 

DF['item_name'].apply(lambda x : str(x)[0]=='N')은 'item_name' 열의 각 요소에 대해서 첫 번째 글자가 'N'인지 확인하는 람다 함수를 적용합니다.


이 lambda 함수는 각 요소를 문자열로 변환하고, 변환된 문자열의 첫 번째 글자가 'N'과 동일한지 확인하여 결과를 불리언(True/False) 값으로 반환합니다.

 

DF[DF['item_name'].apply(lambda x : str(x)[0]=='N')]는 이 불리언 값들을 사용하여
원본 데이터프레임인 DF에서 해당 조건을 만족하는 행들을 선택합니다.

 

[41-2] 코드에 대하여 설명을 하면,

 

DF.item_name.str.startswith('N')은 'item_name' 열의 각 값이 'N'으로 시작하는지 여부를 확인합니다. 


startswith('N') 메서드는 문자열이 'N'으로 시작하면 True를 반환하고, 그렇지 않으면 False를 반환합니다. 결과는 불리언(True/False) 값으로 반환됩니다.


DF[DF.item_name.str.startswith('N')]는 이 불리언 값들을 사용하여
원본 데이터프레임인 DF에서 해당 조건을 만족하는 행들을 선택합니다.

 

결과적으로, [41-1] 코드와 [41-2] 코드 모두 'item_name' 열의 첫 글자가 'N'인 행을 선택하여 반환합니다!


# 8. dataframe에서 groupby 이후 값의 비율 구하기

데이터 전처리를 하면서 group by를 이용해 집계를 한 이후에, 비율을 구한 적은 있는데,

그때는 dataframe을 list로 변환해서 직접 산출했었어요!

 

공부하다 보니 [55] 문제는 집계한 결과를 이용해서 코드 한 줄로 비율을 산출하더라고요!

그래서 어떻게 산출했는지 살펴보았습니다!

 

# 데이터 불러오기
DataUrl = 'https://raw.githubusercontent.com/Datamanim/pandas/main/AB_NYC_2019.csv'
DF = pd.read_csv(DataUrl)

# [55] 데이터중 neighbourhood_group 값에 따른 room_type 컬럼의 숫자를 구하고 
#      neighbourhood_group 값을 기준으로 각 값의 비율을 구하여라
Ans = DF[['neighbourhood_group','room_type']].groupby(['neighbourhood_group','room_type']).size().unstack()
Ans.loc[:,:] = (Ans.values / Ans.sum(axis=1).values.reshape(-1,1))

 

[55]과 Ans.values 그리고 Ans.sum(axis=1).values.reshape(-1,1)의 결과는 아래와 같이 나와요!

 

[55] 코드에 대해서 설명을 해보자면

 

Ans.loc[:,:] = (Ans.values / Ans.sum(axis=1).values.reshape(-1,1))는
생성된 데이터프레임인 Ans의 모든 요소를 해당 열의 합으로 나누어 각 그룹 내에서의 비율을 계산합니다. 
이후 결과는 Ans 데이터프레임에 다시 할당합니다!

 

이 코드를 활용해서 열의 합이 나닌 행의 합으로 나누기 이해서는 axis=1을 axis=0으로 변경해주면 됩니다!

 

print(Ans.values)와 print(Ans.sum(axis=1).values.reshape(-1,1))의 결과를 보면 쉽게 이해하실 것 같아요!


# 9. dataframe에서 결측치 대체하기(ffill / bfill 이용)

결측치 채우기는 데이터 분석과 머신 러닝에서 매우 중요한 과정이에요!

결측치가 있는 데이터를 그대로 사용하면 분석 결과가 왜곡될 가능성이 있고, 데이터 품질이 저하될 수 있습니다. 따라서, 결측치를 적절히 채워야 하는데, 이 과정에서 타당한 방법을 선택하는 것이 매우 중요합니다.

결측치를 채우기 위해 주로 fillna() 함수를 사용해요! 결측치를 채우는 방법은 단순히 데이터를 아무렇게나 채우는 것이 아니라, 데이터의 특성과 분석 목적 등을 고려하여 타당한 방법을 선택해야 합니다.

결측치를 채우는 방법은 다양해요! 일반적으로 전후의 데이터를 활용하는 방법이 많이 사용됩니다. 예를 들어, 앞쪽으로 이전 값이나 뒤쪽으로 다음 값으로 채우는 방법이 있습니다. 이러한 방법은 시계열 데이터의 경우에 특히 유용합니다. 또는 평균값, 중앙값, 최빈값과 같은 대표값을 사용하여 채우는 방법도 일반적으로 사용됩니다. 또는 회귀 모델이나 KNN(K-Nearest Neighbors)과 같은 머신 러닝 알고리즘을 활용하여 결측치를 예측하는 방법도 있습니다.

 

이 문제에서는 전후의 데이터를 활용해서 채우는 방법을 정리해 보았습니다!

 

# 데이터 불러오기
DF = pd.read_csv('https://raw.githubusercontent.com/Datamanim/pandas/main/timeTest.csv')

# [72] 모든 결측치는 컬럼기준 직전의 값으로 대체하고 첫번째 행에 결측치가 있을경우
#      뒤에있는 값으로 대채하라
DF.fillna(method='ffill').fillna(method='bfill')

 

[72]의 출력 결과는 아래와 같이 나와요!

 

 

fillna(method='ffill')은 데이터프레임 DF에서 누락된 값을 앞쪽으로 이전의 값으로 채우는 작업을 수행합니다.
'ffill'은 'forward fill'의 약자로, 앞쪽으로 이전의 값을 가져와 누락된 위치를 채웁니다.

fillna(method='bfill')은 이전 단계에서 처리되지 않은 누락된 값을 뒤쪽으로 다음 값으로 채우는 작업을 수행합니다.
'bfill'은 'backward fill'의 약자로, 뒤쪽으로 다음 값의 값을 가져와 누락된 위치를 채웁니다.


오늘은 빅데이터분석기사(빅분기) 실기를 공부하면서

 

python과 pandas를 이용한 데이터 전처리(3)에 대하여 포스팅하였습니다!

 

요즘은 일이 매우 바빠서 자주 포스팅을 못 했네요! 

 

설명이 어려운 부분 혹은 잘 이해가 안 가는 부분

 

그리고 더 궁금한 내용이 있다면

 

언제든지 댓글로 남겨주세요!

 

빠르게 궁금증을 해결해 드릴게요!

 

공감과 댓글은 큰 힘이 됩니다!

 

오늘도 블로그 방문해 주시고

 

포스팅 읽어주셔서 감사합니다!

 

다들 오류 없는 파이썬 코딩 해보아요!

 

빅데이터 분석기사 실기 공부도 화이팅입니다! :)

LIST