본문 바로가기
ML&DATA/python for data analysis

pandas - (데이터 정제 및 준비)

by sun__ 2020. 7. 22.

7.1 누락된 데이터 처리하기

pandas객체의 모든 기술통계는 누락된 데이터를 배제하고 처리한다. 산술 데이터에 한해서 pandas는 누락된 데이터를 실숫값인 NaN으로 취급한다. 이는 누락된 값을 쉽게 찾을 수 있도록 도와준다.

 

7.1.1 누락된 데이터 골라내기

누락된 데이터를 골라내기 위해 pandas.isnull이나 불리언 색인을 사용해서 직접 골라낼 수 있다.

 

Series의 dropna 메서드는 널이 아닌 데이터와 색인값만 들어있는 객체를 반환.

DataFrame의 dropna는 기본적으로 NA값을 하나이상 포함한 로우를 모두 제외시킨다. how 옵션에 'all'을 넘기면 모든 값이 NA인 로우만 제외시킨다.

컬럼을 제외시키려면 옵션으로 axis=1을 넘겨주면 된다.

 

DataFrame의 로우를 제외시키는 방법은 시계열 데이터에 주로 사용되는 경향이 있다. 몇 개 이상의 값이 들어 있는 로우만 살펴보고 싶다면 thresh 인자에 원하는 값을 넘기면 된다.

 

7.1.2 결측치 채우기

누락된 값을 제외시키지 않고(다른 데이터도 함께 버려질 가능성이 있다.) 데이터 상의 '구멍'을 메우고 싶은 경우가 있다. 이 경우 fillna 메서드에 채워 넣고 싶은 값을 넘겨주면 된다.

fillna에 사전값을 엄겨서 각 컬럼마다 다른 값을 채울 수도 있다.

 

fillna에 inplace 옵션에 True를 넘겨서 기존 객체를 변경할 수도 있다.

재색인에서 사용 가능한 보간 메서드(이전 혹은 다음 값으로 채우기)를 fillna 메서드에서도 사용할 수 있다.

 

 

7.2 데이터 변형

필터링, 정제, 기타 변형 등을 다룬다.

 

7.2.1 중복 제거하기

DataFrame의 duplicated 메서드는 각 로우가 중복인지 아닌지 알려주는 불리언 Series를 반환한다.

drop_duplicates메서드는 duplicated 배열이 False인 DataFrame을 반환한다.

중복을 찾아내기 위해 기본적으론 모든 컬럼을 확인한다. 특정 컬럼이 기반해서 중복을 걸러낼 수도 있다.

keep='last' 옵션을 주면 마지막으로 발견된 값을 기준으로 중복을 거른다.

 

 

 

7.2.2 함수나 매핑을 이용해서 데이터 변형하기

 

Series의 str.lower메서드는 문자열을 소문자 형태로 변경한 객체를 반환한다.

Series의 map 메서드는 사전류의 객체나 함수를 받아서 Series객체를 반환한다. 데이터의 요소별 변환 및 데이터를 다듬는 작업을 편리하게 할 수 있다.

사전을 넘긴 예
함수를 넘긴 예

 

 

7.2.3 값 치환하기

fillna 메서드로 누락된 값을 채우는 일은 일반적인 값 치환 작업이라고 볼 수 있다.

 

map 메서드는 한 객체 안에서 값의 부분집합을 변경하는데 사용했다면 replace 메서드는 같은 작업에 대해 좀 더 유연한 방법을 제공한다. 역시 inplace 옵션을 True로 넘기면 실제로 변경한다.

 

다음 데이터에서 -999.는 누락된 데이터를 나타내기 위한 값이라고 할 떄, 이 값을 NA로 치환하는 코드

여러 개의 값을 한 번에 치환하려면 리스트를 사용하면 된다. 

치환하려는 값마다 다른 값으로 치환하려면 두 개의 리스트를 사용하거나 사전을 이용하면 된다.

 

 

7.2.4 축 색인(Index) 이름 바꾸기

Series와 마찬가지로 축 색인(Index 객체)에도 map 메서드가 있다.

 

원래 객체를 변경하지 않고 새로운 객체를 생성하려면 rename메서드를 사용한다. 사전을 이용해서 축 이름 중 일부만 변경하는 것도 가능하다. 원본 데이터를 바로 변경하려면 inplace=True 옵션을 넘겨주면 된다.

 

 

 

7.2.5 개별화와 양자화

연속 데이터를 개별로 분할하거나 분석을 위해 그룹별로 나누기도 한다.

 

pandas의 cut 함수를 이용해서 그룹별로 나눌 수 있다.

사람들의 나이값들이 담긴 배열을 나이대에 따라 분류하는 예.

cut에서 반환하는 객체는 Categorical이라는 특수한 객체다. 이 객체는 그룹 이름이 담긴 배열이라고 생각하면 된다. 이 Categorical 객체는 codes속성에 있는 ages데이터에 대한 카테고리이름을 categories라는 배열에 담고 있다.

 

Categorical 객체도 역시 pd.value_counts로 도수분포표를 볼 수 있다.

 

반개구간의 중괄호와 대괄호의 위치를 바꾸려면 right=False 옵션을 주면 된다.

labels옵션에 그룹이름 배열을 넘겨 그룹이름을 지어줄 수 있다.

 

cut 함수에 그룸의 경곗값 대신 그룹의 개수를 넘겨주면 데이터에서 최소값과 최대값을 기준으로 균등한 길이의 그룹을 자동으로 계산한다. precision=2옵션은 소수점 아래 2자리까지로 제한한다.

 

 

구간마다 동일한 개수의 표본이 포함되도록 그룹을 나눌 수도 있다.

qcut은 표본 변위치(분위수, quantile)를 기반으로 데이터를 나눠준다.

 

7.2.6 특잇값을 찾고 제외하기

배열 연산을 수행할 때는 특잇값(outlier)을 제외하거나 적당한 값으로 대체하는 것이 중요하다. 

 

 

아래와 같은 데이터로 특이값(절댁값이 3을 초과)을 찾고 적절한 값으로 변경해보자

 

컬럼마다 찾아내는 방법. ex)2번 컬럼에서 찾기

 

절대값이 3이 초과하는 값이 들어있는 로우를 선택하려면 DataFrame의 any 메서드를 사용하면 된다.

 

np.sign(DataFrame)은 DataFrame의 값이 양수면 1 음수면 -1이 담긴 배열을 반환한다.

위 메서드를 응용하여 쉽게 값을 변경할 수 있다.

data[np.abs(data)>3] = np.sign(data)*3

 

 

 

7.2.7 치환과 임의 샘플링

numpy.random.permutation 함수를 사용하면 Series나 DataFrame의 로우를 쉽게 임의 순서로 재배치할 수 있다. 순서를 바꾸고 싶은 만큼의 길이를 permutation함수로 넘기면 바뀐 순서가 담긴 정수 배열이 생성된다. 이 배열은 iloc기반의 색인이나 take함수에서 사용 가능하다. 

그냥 Series나 DataFrame의 일부만 임의로 선택하려면 Series나 DataFRame의 sample 메서드를 사용하면 된다.

중복선택을 허용하려면 replace = True 옵션을 주면 된다.

 

 

7.2.8 표시자/더미 변수 계산하기

 

DataFrame에서 한 컬럼마다 값이 있을텐데, 각 값들을 column명으로 하고 인덱스마다 원래 DataFrame에서 등장했으면 1, 아니면 0을 출력한 테이블을 '더미'라고 한다.

 

 

get_dummies에서 prefix옵션에 문자열을 넣으면 '문자열_기존컬럼명'형태로 바뀐 객체를 반환한다. join 연산으로 다른 DataFrame이나 Series에 붙일 수 있다.

 

pd.cut과 같이 써서 유용한 경우가 많다

 

7.3 문자열 다루기

pandas는 배열 데이터 전체에 쉽게 정규 표현식을 적용하고, 누락된 데이터를 편리하게 처리할 수 있는 기능을 포함한다.

 

7.3.1 문자열 객체 메서드

파이썬 내장 문자열 메서드 만으로도 해결할 수 있는 문제가 많다.

 

쉼표로 구분된 문자열을 파싱하는 예

줄바꿈 문자를 포함하여 공백문자를 제거하려면 strip 메서드와 같이 사용하면 된다.

 

 

문자열 배열을 특정 문자열과 혼합하여 하나의 문자열로 바꿀 수 있다.

 

일치하는 부분 문자열의 위치를 찾을 수도 있다.

x in y:  x가 y의 부분 문자열이면 True 반환

y.index(x) : y의 부분 문자열 x의 위치 반환. x가 없다면 예외 발생

y.find(x) : y의 부분 문자열 x의 위치 반환. x가 없다면 -1 반환

y.count(x) : y에 x가 몇 건 발견됐는지

y.replace(x, x_) : 찾아낸 패턴을 다른 문자열로 치환함. 패턴을 삭제하는 방법으로 자주 사용

 

 

 

 

 

 

 

 

 

 

7.3.2 정규 표현식

regex라고 불리는 단일 표현식을 정규 표현 언어로 구성된 문자열이다. 파이썬 내장 re모듈 알아보자.

 

re 모듈함수는 패턴 매칭, 치환, 분리 세 가지로 나눌 수 있다. 

 

다양한 공백문자가 포함된 문자열을 나누고 싶다면 하나 이상의 공백문자를 의미하는 \s+를 사용한다.

re.split('\s+', text)을 사용하면 먼저 정규 표현식이 컴파일되고 그 다음에 split 메서드가 실행된다. re.compile로 직접 정규 표현식을 컴파일하고 그렇게 얻은 정규 표현식 객체를 재사용하는 것도 가능하다.

정규 표현식에 매칭되는 모든 패턴의 목록을 얻고 싶다면 findall메서드를 사용한다.

 

findall : 문자열에서 일치하는 모든 부분문자열을 찾아준다

search : 패턴과 일치하는 첫번째 문자열을 찾아서 match 객체를 반환한다.

match : target문자열의 첫부분부터 시작했을 때 패턴과 일치하면 그 문자열을 반환한다.

sub 메서드는 찾은 패턴을 문자열로 치환하여 새로운 문자열을 반환한다.

 

이메일 주소를 찾아서 동시에 각 이메일 주소를 사용자이름, 도메인이름, 도메인 접미사 세 가지 컴포넌트로 나눠야 한다면 각 패턴을 괄호로 묶어준다. 

패턴을 찾은 후 반환된 match 객체를 이용하면 groups 메서드로 각 패턴 컴포넌트의 튜플을 얻을 수 있다.

findall 메서드는 튜플의 리스트를 반환한다.

sub는 \1, \2와 같은 기호를 사용해서 각 패턴 그룹에 접근할 수 있다. \1은 1번 그룹을 의미한다.

 

7.3.3 pandas의 벡터화된 문자열 함수

 

data.map으로 특정 요소들을 한 번에 처리하고 싶을 때가 있다. 하지만 이는 NA값을 만나면 실패하게 된다. map을 적용하고 싶으면 우선 NA값을 제외한 원하는 요소들을 고른 후에 적용하면 된다.