데이터를 여러 기준으로 그룹화 하는 방법 (데이터 재구성)
아래 가상의 데이터를 그룹핑 하는 법을 두 가지 방식으로 안내할 예정이다. 통상적으로 '데이터 재구성'이라는 표현을 많이 쓰는 것 같다.
아래의 DataFrame을 df라는 변수로 불러온 뒤 업종, 광고주, 상품, 매체별 금액으로 보고자 한다.
1. groupby()
데이터를 여러 가지 기준으로 그룹화 하고싶을 때 쓰는 방법이 있다. 우선 가장 흔히 그룹핑할 때 사용하는 pandas DataFrame의 .groupby
문법은 아래와 같다.
syntax: DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=NoDefault.no_default, observed=False, dropna=True)
by: 그룹핑 기준. 자료 형태는 mapping, function, label, or list of labels 가 들어올 수 있다.
axis: 행을 그룹화 할 것인지, 열을 그룹화 할 것인지 지정할 수 있다. 디폴트는 axis=0 즉, 행을 그룹핑 하는 것이다. 열을 그룹핑 하고싶으면 axis=1
level: 축이 멀티인덱싱 되어있을 때 (하나의 그룹이 아닌 다중 그룹으로 묶여있을 때) 특정 기준을 통해
여기서 위에 설명한 것처럼 by의 값을 list로 묶어 DataFrame.groupby(by=[a,b,c] ... ) 형태로 사용할 수 있다. 즉, by 내의 list value들을 다중 인덱싱(multi-indexing) 할 수 있다.
사실 글로 설명하면 멀티인덱싱에 대한 개념이 잘 들어오지 않으므로 예제를 통해서 알아보자.
업종, 광고주, 상품, 매체별 금액을 보는 것이 목적이므로
그룹핑 대상: 업종, 광고주, 상품, 매체 가 될 것이며, 그룹별 금액을 보고자 하므로 금액을 모두 합산해 주기로 한다.
df=df[df['항목']=='금액'] #df의 항목 컬럼의 값이 '금액'인 것만 추출
df.drop('계', axis=1, inplace=True) #금액의 합산값을 사용하므로, 총계 컬럼을 제외, inplace=True로 데이터에 바로 적용
df_=df.groupby(by=['업종', '광고주', '상품', '매체', '항목']).sum() #df_ 라는 변수에 아래와 같이 지정
#그룹핑한 테이블에 어떤 값을 반영할 것인지 (이 경우에는 sum값) .groupby 뒤 method로 지정 (.sum())
위 코드를 실행하면 아래와 같이 업종-광고주-상품-매체-항목별 하위 그룹을 생성하며 데이터가 그룹핑 된다.
2. pivot_table()
pivot_table()을 사용해서 같은 결과를 만들 수 있다.
Syntax:
DataFrame.pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False, sort=True)
엑셀의 pivot table을 자주 사용하는 사람이라면 어떤 식으로 데이터를 만들어주는 지 바로 이해할 수 있을 것 같다.
index, columns, values: 피벗테이블에 지정할 인덱스, 컬럼, 값
aggfunc: 연산 방법을 지정. 통계 함수 사용 가능. groupby 에서 method로 지정한 것과 같다. default는 mean
fill_value: NaN 값 대치
margins: 부분합에 대한 컬럼 추가
dropna: 피벗테이블을 생성한 뒤 생기는 null 값을 떨군다
margins_name: margins의 컬럼 이름을 지정, default 는 'All'
df를 다시 불러와서 이번에는 pivot_table 로 재구성해보자.
df2=df.pivot_table(index=['업종', '광고주', '상품', '매체', '항목'], aggfunc='sum')
#index에 그룹핑할 기준들을 지정, value는 들어갈 수 있는 자료가 하나밖에 없으므로 (금액) 생략했다
이렇게 pivot_table로 지정해도 같은 값이 나온다. 문제는 글자순으로 정렬되다보니 컬럼 순서를 그대로 가져오지 않고 자동으로 오름차순 정렬을 한 것이다. 구글링을 해도 찾아보기 쉽지 않았는데, 추후 해결되면 추가로 작성해야겠다.
사실 추후에 작업할 내용에 sorting이 있기때문에 지금 굳이 정렬을 하지는 않아줘도 괜찮다.
다음은 컬럼을 행으로 변환시켜 '일자'컬럼을 만들고, 추후 분석하기 쉽도록 pivot table의 멀티 인덱스를 해제해줄 예정이다.
데이터 재구성은 주로 groupby 만 사용했고, pivot_table을 습관적으로 사용하지는 않았는데 게시글을 작성하면서 조사하다보니 초기에 설정 가능한 유용한 기능이 많다는걸 알았다. groupby 뿐만 아니라 pivot 관련한 메소드도 자유자재로 사용할 수 있도록 연습해야겠다.
'Python' 카테고리의 다른 글
[Python] 디렉토리 내 파일 불러오기 + 반복 작업 (os.listdir + 반복문) (0) | 2022.11.12 |
---|---|
[Pandas][Analysis] 데이터 분포 및 형태 알아보기: info, describe, boxplot, displot 등 (2) | 2022.10.23 |
[Python][Pandas] H&M Commerce Data (1) 전처리: 인덱스(.iloc)를 활용한 데이터 슬라이스 (데이터 쪼개기) (3) | 2022.09.09 |
[Pandas] index 설정, sequence id 컬럼 생성 (5) | 2022.08.31 |
[데이터전처리(2)][Pandas] 멀티인덱스 해제(.unstack) 및 DataFrame 행렬 전치 (.T) (0) | 2022.05.13 |