Prev Contents/Wrangling

[파이썬 라이브러리를 활용한 데이터 분석] 14, 15일차 (307~345p)

Convergence Medicine 2022. 6. 25. 22:03

8. 데이터 준비하기: 조인, 병합, 변형

14, 15일차 (2020-06-24, 25)도 이 책으로 시작:

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791162241905&orderClick=LEa&Kc=

 

파이썬 라이브러리를 활용한 데이터 분석 - 교보문고

영화 평점, 이름통계, 선거 데이터 등 실사례 사용 | ★ 『파이썬 라이브러리를 활용한 데이터 분석』 드디어 개정!이 책의 초판이 출간된 2012년은 pandas 개발 초기로, 파이썬용 오픈소스 데이터

www.kyobobook.co.kr

아래의 요약은 책을 충실히 요약한 것이 아닌 오늘 공부한 것의 정리일 뿐입니다.
저자의 코드 예제 github repository: http://github.com/wesm/pydata-book
자세한 내용 책을 사서 보시거나 영문판의 경우 저자의 홈페이지에 3판의 open edition이 있습니다 (https://wesmckinney.com/book/).

 

GitHub - wesm/pydata-book: Materials and IPython notebooks for "Python for Data Analysis" by Wes McKinney, published by O'Reilly

Materials and IPython notebooks for "Python for Data Analysis" by Wes McKinney, published by O'Reilly Media - GitHub - wesm/pydata-book: Materials and IPython notebooks for "Pyth...

github.com

 

Python for Data Analysis, 3E

About the Open Edition The upcoming 3rd edition of Python for Data Analysis is available as an “Open Access” HTML version on this site https://wesmckinney.com/book in addition to the usual print and e-book formats. This is currently an Early Release ve

wesmckinney.com

독자에게 전하는 조언:

1) 데이터 분석을 생산적으로 하기 위해 파이썬으로 훌륭한 소프트웨어를 개발할 수 있을 정도로 파이썬 고수가 되어야 할 필요는 없다고 생각한다.
2) Numpy의 깊은 이해가 필수 사항은 아니며, 배열 위주의 프로그래밍과 생각하는 방법에 능숙해지는 것이 과학 계산의 고수가 되는 지름길이다.

들어가며

데이터를 합치고, 재배열할 수 있는 도구들

8.1 계층적 색인

축에 대해 다중 (둘 이상의) 색인 단계를 지정할 수 있다.
바로 위 단계의 색인을 이용해서 하위 계층을 직접 접근할 수 있다.
데이터의 부분집합을 부분적 색인으로 접근할 수 있다.
하위 계층의 객체를 선택하는 것도 가능

데이터를 재형성하고 피벗테이블 생성 같은 그룹 기반의 작업을 할 때 중요
DataFrame 객체에 unstack() 메서드를 사용해서 새롭게 배열, 원래대로는 stack() 메서드 수행

DataFrame에서는 두 축 모두 계층적 색인을 가질 수 있다.
계층적 색인의 각 단계는 이름을 가질 수 있다. - index.names, column.names 속성에 이름의 문자열로 리스트 전달
pd.DataFrame 함수의 호출 전 MultiIndex.from_arrays()에 index와 컬럼 이름을 전달하여 따로 생성한 후 재사용할 수 있다.

8.1.1 계층의 순서를 바꾸고 정렬하기

계층의 순서를 바꾸거나 지정된 계층에 따라 데이터를 정렬해야 하는 경우

  • swaplevel은 넘겨 받은 두 개의 계층 번호나 이름이 뒤바뀐 객체를 반환
  • sort_index() 메서드는 단일 계층에 속한 데이터를 정렬
frame.swaplevel(0, 1).sort_index(level=0)

8.1.2 계층별 요약 통계

level 옵션 - 어떤 한 축에 대해 합을 구하고 싶은 단계를 지정

Refer pd.groupby() 기능을 이용해서 구현되었는데, 나중에 나온다.

8.1.3 DataFrame의 컬럼 사용하기

로우를 선택하기 위한 색인으로 하나 이상의 컬럼을 사용하거나, 로우의 색인을 DataFrame의 컬럼으로 옮기고 싶을 때
계층적 색인을 이용한 새로운 DataFrame으로 만들어 준다. - set_index()함수
drop=False를 전달해야 기존 계층적 색인으로 가기 전 데이터를 그대로 두고 변형한다.
reset_index() - 계층적 색인 단계를 다시 컬럼으로 이동

8.2 데이터 합치기

8.2.1 데이터베이스 스타일로 DataFrame 합치기

병합 (merge)이나 join 연산은 관계형 데이터베이스의 핵심적인 연산으로 하나 이상의 를 사용해서 데이터 집합의 로우를 합친다.
merge() 함수 - 어떤 컬럼을 병합할 것인지 명시하지 않았는데, 알아서 중복된 컬럼 이름을 키로 사용
하지만, 명시적으로 지정해 주는 습관을 들이는 것이 좋다.
left_on=, right_on= 인자에 키로 사용할 컬럼을 전달
기본적으로 inner join을 수행하여 교집합인 결과를 반환
how 인자로 left, right, outer를 전달하여 각각 왼쪽, 오른쪽, 외부 조인을 수행할 수 있다.

Refer 표 8-1 how 옵션에 따른 다양한 조인 연산

다대다 병합은 두 로우의 데카르트 곱을 반환한다.
여러 개의 키를 병합하려면 컬럼 이름이 담긴 리스트를 전달
suffixes= 인자 - 컬럼 이름이 겹칠 경우 각 컬럼 이름 뒤에 붙일 문자열의 튜플 전달, 기본값은 ('_x', '_y')

8.2.2 색인 병합하기

병합하려는 키가 DataFrame의 색인일 경우
left_index=True, right_index=True 옵션을 지정해서 해당 색인을 병합키로 사용할 수 있다.
리스트로 여러 개의 컬럼을 지정해서 병합 (how='outer'인자로 호출해야 함)
양쪽에 공통으로 존재하는 여러 개의 색인을 병합하는 것도 가능

join() 메서드 - 컬럼이 겹치지 않으며 완전히 같거나 유사한 색인 구조를 가진 여러 개의 DataFrame 객체를 병합
왼쪽 조인을 수행한다.
색인 대 색인으로 DataFrame을 병합하려면 DataFrame의 리스트를 join 메서드로 넘기면 된다.

8.2.3 축 따라 이어붙이기

numpy의 concatenate() 함수
pandas의 concat() 함수 - 리스트로 묶어서 전달하여 값과 색인을 연결
axis=0 - 모든 행 방향이 기본값
outer join이 기본값, join='inner'를 넘겨서 교집합을 구할 수도 있다.
join_axes 인자로 병합하려는 축을 직접 지정
keys 인자 - 계층적 색인을 생성
Series를 axis=1 방향으로 병합 - 모든 컬럼 방향으로 DataFrame이 생성
그러므로 keys 인자는 DataFrame의 컬럼 제목이 된다.
리스트 대신 사전을 넘기면 사전의 키가 keys 인자로 사용된다.
새로 생성된 계층의 이름은 names 인자로 지정
ignore_index=True - 로우 색인이 불필요한 경우

Refer 표 8-3 concat 함수 인자

8.2.4 겹치는 데이터 합치기

두 데이터셋의 색인이 일부 겹치거나 전체가 겹치는 경우 병합이나 이어 붙이기가 불가능한 경우
Series에서 두 데이터셋의 NA 값을 대체하기

Example np.where()

np.where(pd.isnull(a), b , a)

combine_first() 메서드는 위와 동일한 연산과 데이터 정렬을 해줌

8.3 재형성과 피벗

8.3.1 계층적 색인으로 재형성하기

stack() - 데이터의 컬럼을 로우로 피벗, Series 객체를 반환
unstack() - 데이터의 로우를 컬럼으로 피벗, 다시 DataFrame으로 변환
레벨 숫자나 이름을 전달해서 끄집어낼 단계를 지정할 수 있다.
해당 레벨에 있는 모든 값이 하위그룹에 속하지 않을 경우
unstack()을 하게 되면 누락된 데이터가 생길 수 있다.
stack()메서드는 누락된 데이터를 자동으로 걸러내기 때문에 쉽게 원상 복구 가능
dropna=False를 전달하여 확인 가능하다.

8.3.2 긴 형식에서 넓은 형식으로 피벗하기

긴 형식 - 여러 시계열이나 둘 이상의 키를 가지고 있는 다른 관측 데이터에서 사용
시간값으로 색인된 개별 item을 컬럼으로 포함시키는 형식을 더 선호한다면 - pivot() 메서드 사용
처음 두 인자는 로우와 컬럼 색인으로 사용될 컬럼 이름,
마지막 두 인자는 DataFrame에 채워 넣을 값을 담고 있는 컬럼 이름
set_index()를 사용해 계층적 색인을 만들고 unstack() 메서드를 이용해 형태를 변경하는 것과 같은 함수이다.

8.3.3 넓은 형식에서 긴 형식으로 피벗하기

pd.melt() - 여러 컬럼을 하나로 병합하고 DataFrame을 긴 형태로 만들어 낸다.
반드시 어떤 컬럼을 그룹 구분자로 사용할 것인지 지정해야 함
pivot을 사용해서 원래 모양으로 되돌릴 수 있다. 더해서 reset_index() 메서드를 이용해서 그룹 구분자로 사용하던 컬럼을 다시 데이터 내의 컬럼으로 돌려 놓을 수 있다.
데이터 값으로 사용할 컬럼들의 집합을 지정 - id_vars=, value_vars=
그룹 구분자 없이도 사용할 수 있다. - value_vars= 인자에만 리스트를 전달

8.4 마치며

불러오고, 정제하고, 재배열하는 방식

오늘의 흔적: