import pandas as pd
train_data = pd.read_csv('./train.csv')
train_data.head()

Groupby 이해하기

모든 groupby 연산은 기존 객체에 대해 다음과 같은 연산 중 하나를 포함한다.

  • 데이터 분할하기
  • 데이터 연산하기 (통계적으로 계산, 조건에 맞는 데이터 걸러내기, 그룹별 작업 수행)
  • 데이터 병합하기

1. 데이터 분할하기

1) groupby()를 이용한 데이터 분할

Pandas 객체를 분할할 때는 groupby() 메소드를 사용하며 인자로는 column이름이나 column으로 이루어진 리스트를 전달하면 된다.

class_group = train_data.groupby('Pclass')

 

class_group.groups

그렇게 만들어진 class_group의 속성을 살펴보면, class_group는 DataFrameGroupBy 객체이며 각 column과 column에 속한 index를 dict형태로 표현한 것을 알 수 있다. key는 해당 column의 카테고리이고, value는 key와 일치하는 값을 가진 row의 index이다. 다수의 column을 group하면 key는 각각의 column의 카테고리를 튜플 형태로 나타낸다.

class_and_gender_group = train_data.groupby(['Pclass', 'Sex'])
class_and_gender_group.groups

 

 

2) index를 이용한 데이터 분할

  1. set_index() : column 데이터를 index레벨로 변경
  2. reset_index() : index 초기화

set_index를 통해 우리가 원하는 column을 index레벨로 변경할 수 있다. column 들을 리스트 형태로 묶으면 다중 index를 만들 수 있다.

train_data.set_index(['Pclass', 'Sex'])

이렇게 만들어진 인덱스 레벨을 다시 원래 dataframe에 넣고 싶으면 reset_index를 사용하면된다. reset_index를 사용하면 index레벨에 있던 column이 dataframe으로 돌아가며, 그 위치는 맨 처음이 된다. 다중 index에서도 가능하다.

train_data.set_index(['Pclass', 'Sex']).reset_index()

이렇게 우리가 원하는 column을 index로 설정했으면, 우리는 groupby(level = int)를 통해 index를 기준으로 그룹핑 할 수 있다. 여기서 level은 index의 깊이를 의미하며 가장 왼쪽에서부터 0에서부터 1씩 증가한다. 앞에서 다수의 column으로 그룹핑 한 것처럼 level을 이용해서 다수의 column으로 그룹핑 할 수 있는데, 이때는 level을 리스트 형식으로 만들어 그룹핑 하고 싶은 column을 int형식으로 제공해주면 된다. (다중 index로 설정할 때 가장 중요하다.)

그룹핑할 때, level = 1로 설정했으므로 Pclass_and_Sex_group의 key 값은 Sex로 설정된다.
(만약, Pclass와 Sex로 그룹핑하고 싶으면 level = [0, 1]로 설정해 주면 된다. 이때, 순서에 따라 어떤 그룹으로 묶이는지 달라진다. 즉 level = [0, 1]과 level = [1, 0]은 다르다는 말이다.)

Pclass_and_Sex_group = df.set_index(['Pclass', 'Sex']).groupby(level=1)
Pclass_and_Sex_group.groups

 


2. 데이터 연산하기 -1)

1) 각종 함수 활용하여 연산하기 

앞에서 각각의 column들을 그룹핑하였으면, 그룹핑한 객체를 기반으로 연산할 수 있는 다양한 함수들이 있다. 그 중에서 대표적인 10개만 나열해보았다. (NaN 데이터는 제외하고 연산한다.)

  1. count() : 그룹 내 Non-NA 갯수
  2. sum() : 그룹 내 Non-NA 들의 합
  3. min() : 최솟값
  4. max() : 최댓값
  5. mean() : 평균값
  6. std() : 표준편차
  7. var() : 분산
  8. first() : 그룹 내 Non-NA 값 중 첫번째 값
  9. last() : 그룹 내 Non-NA 값 중 마지막 값
  10. describe() : 그룹의 기술 통계량

 

다중 index를 활용한 연산

Pclass_and_Sex_group = train_data.set_index(['Pclass', 'Sex']).groupby(level=[0, 1]) 
Pclass_and_Sex_group.mean()

Pclass_and_Sex_group = train_data.set_index(['Pclass', 'Sex']).groupby(level=[1, 0]) 
Pclass_and_Sex_group.mean()

 

 

2) 연산하고 싶은 함수를 직접 만들어 활용하기: Aggregate(), Agg()

내장된 함수에 내가 원하는 연산의 함수가 없을 수도 있다. 보통 그럴 때는 내가 원하는 함수를 직접 만들어 사용하는데 이렇게 만든 함수를 agg() 혹은 aggregate()를 이용해서 dataframe에 적용시킬 수 있다.

Pclass_and_Sex_group = train_data.set_index(['Pclass', 'Sex']).groupby(level=[0, 1]) 
Pclass_and_Sex_group.agg([np.mean, np.sum, np.max])

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기