본문 바로가기
Python/데이터 다루기

pandas를 활용한 데이터 정리

by 찐남 2022. 4. 30.

우리가 현실에서 마주하게 되는 

실제 데이터 세트는

정리되지 않은 지저분한(?) 형태이므로

데이터가 분석에 적합하도록

데이터 전처리 또는 정리가 필수적입니다.

 

데이터 정리에는

 

1) 데이터 간격 정리

2) 데이터 오류 수정

3) 데이터 세트 결합

4) 데이터 집계

5) 새로운 feature 생성

 

등이 포함됩니다.


이번 포스팅에서는 pandas를 사용하여

'Marks_data'라는

매우 간단한 데이터 세트를 활용해서

데이터 정리 방법에 대해 설명합니다.

 

marks_data.csv
0.00MB

 

위의 데이터 세트를 다운로드하여

pandas 패키지로 로딩합니다.

 

 

import pandas as pd

# 데이터 로딩
marksData = pd.read_csv('C:\marks_data.csv')
marksData 

 

marksData.shape
# (19, 3)
# 19개의 데이터와
# 3개의 feature로 구성 

 


1. 결측치 처리하기

결측치를 처리하는 방법은

데이터를 얼마나 이해하는지에

달려 있습니다.

 

상황에 따라 결측 값을

처리하기 위한 전략이 있습니다.

 

예를 들어,

데이터가 입력되지 않았거나

사용할 수 없어서

누락되었을 수 있습니다.

 

pandas는 누락된 값을

NaN으로 나타냅니다.

 

1.1. 누락된 값을 값으로 채우기

정리된 데이터를 저장할 cleanData라는 

새로운 데이터 프레임을 만들겠습니다.
인덱스 8과 16에 누락된 값(NaN)이 있네요.

fillna() 함수를 사용하여

NaN 값을 "unknown"으로 대체하겠습니다.

 

# NaN을 "unknown"으로 채우기
cleanedData = marksData.fillna('unknown')
cleanedData

위의 데이터 프레임에서 

인덱스 8과 16의 NaN 값이 

"알 수 없음"으로 대체되었습니다.

 

1.2. dropna() 함수를 사용하여 누락된 데이터가 있는 행 삭제

결측 값을 처리하는 다른 방법은 

결측 값이 있는 행을 삭제하는 것입니다. 

아래 코드를 사용하여 

인덱스 8과 16에서 NaN 값을 

삭제할 것입니다.

 

# 결측치 삭제
cleaneData = marksData.dropna()
cleanedData

 

위의 데이터 프레임에서

인덱스 8과 16이 삭제되었음을

알 수 있습니다.

 

 

2. 중복 값 처리

데이터 세트를 잘 보시면,

인덱스 12와 14가 완전히

동일한 데이터라는 사실을

알았을 것입니다.

 

이러한 작은 데이터 세트에서도

중복 값을 찾기가 쉽지 않고,

특히 매우 큰 데이터 세트에서는

더욱 어렵습니다.


중복 값을 찾는 데 사용되는 코드는 

DataFrame. duplicated()입니다.
중복 값을 처리하는 일반적인 전략은 

중복 값을 삭제하는 것입니다. 

drop_duplicates() 함수를 사용하여

중복을 찾아 삭제합니다.

 

# 모든 칼럼이 동일한 데이터 찾기

duplicateRows = marksData[marksData.duplicated()]
duplicateRows

 

# 모든 칼럼이 동일한 데이터 제외하기

uniqueData = marksData[~marksData.duplicated()]
uniqueData

 

위의 데이터 프레임에서

인덱스 14가 삭제되었음을

알 수 있습니다.

 

3. 일치하지 않는 라벨 수정

데이터 세트에서 

일관성 없는 레이블이 

있음을 알 수 있습니다. 

 

예를 들어,

'Math'와 'Mathmathics'가 있습니다.

 

이러한 데이터 세트에서

다른 과목(Subject)을 찾기 위해

코드를 실행하면

'Math'와 'Mathmathics'을

다른 과목으로 인식하여 

4개 대신 5개를 찾게 됩니다.

 

결국, 컴퓨터는 다르게 인식하지만,

우리는 'Math'와 'Mathmathics'이

같다는 것을 알 수 있습니다.

 

# distinct 한 과목 리스트 구하기

subjects = marksData.Subject.dropna().unique()
sorted(subjects)

데이터 세트의 unique 한

과목 리스트를 가져온 후,

과목을 기준으로 정렬된

리스트를 가져옵니다.

 

# 동일한 데이터 프레임을 (깊은) 복사하기
cleanedData = marksData.copy(deep = True)

# 일치하지 않는 레이블 수정
cleanedData.update(pd.Series(['Math'], name='Subject', index=[5]))
cleanedData

 

update() 함수를 사용하여

인덱스 5에 있는 과목 열의

'Mathmathics'에서 'Math'로 값을

업데이트하여,

 

인덱스 5의 과목이

'Mathmathics'에서 'Math'로

변경되었습니다.

 

4. 숫자 내 문자 값 수정

간혹, 인덱스 3과 17과 같이 

숫자 안에 문자가 있을 수 있습니다.

 

이 경우 합계를 시도하면

오류가 발생합니다.

 

이러한 문제를 해결하기 위해

update() 함수를 이용합니다.

 

# 숫자 내 문자 값 수정

cleanedData.update(pd.Series([70], name = 'Marks', index=[3]))
cleanedData

 

인덱스 3의 출력이 7o에서 70으로 

업데이트되었습니다.

 

이상 pandas를 활용한 데이터 정리를

알아보았습니다.

 

 

반응형

댓글