본문 바로가기
공부한 것들../Pandas

Pandas 데이터 그룹화

by bottle-an00 2024. 9. 14.

코드 프레소 [파이썬으로 배우는 데이터 분석: Pandas]  강의 내용 정리

 

# 데이터 그룹화..?

강의 자료에서 데이터 그룹화의 예시에 아주 적합한 시각 자료가 있어 이를 활용하여 데이터 그룹화에 대해 설명하도록 하겠다. 

 

위의 데이터에는 노선 번호별 승하차에 대한 정보가 담겨있다. 이 데이터를 그대로 사용하면 전체 데이터를 정확히 분석하기에 어려움이 있다. 따라서 이를 노선별로 그룹화하는 과정이 필요하다 

위의 그림은 노선별로 mean()을 적용하여 노선별로 승하차 평균이라는 결과 집계를 얻을 수 있다. 데이터 그룹화 연산은 아래 과정을 거친다. 

  • 전체 데이터를 그룹별로 나눈다.(split)
  •  각 그룹별로 집계함수를 적용(apply)
  •  그룹별로 집계결과를 하나로 합친다.(combine)

 

Pandas 라이브러리에서는 데이터 그룹화를 위해 pandas.DataFrame.groupby()를 활용한다. 

# API Reference

API Reference::pandas.DataFrame.groupby()

 

# parameter 정리

 

  • by (mapping, function, label, pd.Grouper, or list of such): 그룹을 결정하는 기준.
    • 함수가 전달되면, 객체의 인덱스에 대해 함수가 호출된다.
    • 딕셔너리나 시리즈가 전달되면 그 을 사용해 그룹을 결정한다.
    • 리스트나 ndarray가 전달되면, 해당 값들을 그룹화의 기준으로 사용한다.
    • 컬럼 이름을 기준으로 그룹화하려면 레이블이나 레이블 목록을 전달한다.
    • 튜플은 단일 키로 해석된다.
  • axis ({0 or ‘index’, 1 or ‘columns’}, 기본값 0):
    • 행(0) 또는 열(1)을 기준으로 데이터를 분할한다.
    • axis=1은 더 이상 사용되지 않으며, 미래 버전에서 제거될 예정이므로 frame.T.groupby(...)를 대신 사용할 것을 권장한다.
  • level (int, level name, or sequence, 기본값 None):
    • MultiIndex가 있는 경우, 특정 레벨 또는 레벨들을 기준으로 그룹화한다. by와 level을 동시에 지정할 수 없다.
  • as_index (bool, 기본값 True):
    • 그룹 레이블을 인덱스로 반환할지 여부를 지정한다. as_index=False는 SQL 스타일의 그룹화된 출력과 유사하다.
    • 필터링 작업에는 영향을 미치지 않는다 (예: head(), tail(), nth() 등).
  • sort (bool, 기본값 True):
    • 그룹 키를 정렬할지 여부. 성능 향상을 위해 False로 설정할 수 있다.
    • 각 그룹 내의 관측치 순서에는 영향을 미치지 않으며, sort=False로 설정하면 원래 데이터프레임 순서대로 그룹이 나타난다.
  • group_keys (bool, 기본값 True):
    • apply() 호출 시 그룹 키를 인덱스에 추가할지 여부를 결정한다.
    • 결과 인덱스와 컬럼이 입력과 일치하면 기본적으로 그룹 키는 포함되지 않지만, 그렇지 않은 경우에는 포함된다.
  • observed (bool, 기본값 False):
    • 카테고리형 데이터 그룹화 시 사용. True일 경우 관찰된 값만 표시하고, False일 경우 모든 값을 표시한다.
    • 향후 버전에서 기본값이 True로 변경될 예정.
  • dropna (bool, 기본값 True):
    • 그룹 키에 NA 값이 있는 경우, 해당 행/열을 드롭할지 여부를 지정한다. False로 설정하면 NA 값도 그룹의 키로 처리된다.

 

# 예시코드 : 데이터 그룹화 실습 

import pandas as pd
import numpy as np

# 실습 데이터 생성
sample = {'product':['a','b','a','b','a','b','a','a'],
          'sensor':['s1','s1','s2','s3','s2','s2','s1','s3'],
          'x':np.arange(1,9),
          'y':np.arange(5,13)}

df = pd.DataFrame(data=sample)
print(df)


'''
product 컬럼 기준으로 그룹화하기
'''
print('\n#1 groupby-product')
grouped_product = df.groupby('product')
print(grouped_product)


'''
grouped_product 에 저장된 key와 value 출력하기
'''
print('\n#2 key & value')
for key, value in grouped_product:
      print("-----------------------")
      print("key :", key)
      print("value :\n", value)

 

  product sensor  x   y
0       a     s1  1   5
1       b     s1  2   6
2       a     s2  3   7
3       b     s3  4   8
4       a     s2  5   9
5       b     s2  6  10
6       a     s1  7  11
7       a     s3  8  12

#1 groupby-product
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f9b6769bee0>

#2 key & value
-----------------------
key : a
value :
   product sensor  x   y
0       a     s1  1   5
2       a     s2  3   7
4       a     s2  5   9
6       a     s1  7  11
7       a     s3  8  12
-----------------------
key : b
value :
   product sensor  x   y
1       b     s1  2   6
3       b     s3  4   8
5       b     s2  6  10

 

# 예시코드: 데이터 그룹화 결과에 집계함수 적용

import pandas as pd
import numpy as np

# 실습 데이터 생성
sample = {'product':['a','b','a','b','a','b','a','a'],
          'sensor':['s1','s1','s2','s3','s2','s2','s1','s3'],
          'x':np.arange(1,9),
          'y':np.arange(5,13)}

df = pd.DataFrame(data=sample)
print(df)

'''
groupby 결과에 집계함수 적용하기
'''
print('\n#3 groupby-product')
grouped_product = df.groupby('product').sum()
print(grouped_product)


'''
product, sensor 기준으로 그룹화하기
'''
print('\n#4 groupby-product,sensor')
grouped_product = df.groupby(['product','sensor']).sum()
print(grouped_product)


'''
그룹화한 뒤 x 컬럼에 대해서만 집계함수 적용하기
'''
print('\n#5 groupby-product,sensor')
grouped_product = df.groupby(['product','sensor'])['x'].sum()
print(grouped_product)


'''
그룹화한 뒤 컬럼별 다른 집계함수 적용하기
'''
print('\n#6 groupby-product,sensor')
condition = {'x':'max', 'y':'min'}
grouped_product = df.groupby(['product','sensor']).agg(condition)
print(grouped_product)
  product sensor  x   y
0       a     s1  1   5
1       b     s1  2   6
2       a     s2  3   7
3       b     s3  4   8
4       a     s2  5   9
5       b     s2  6  10
6       a     s1  7  11
7       a     s3  8  12

#3 groupby-product
          x   y
product        
a        24  44
b        12  24

#4 groupby-product,sensor
                x   y
product sensor       
a       s1      8  16
        s2      8  16
        s3      8  12
b       s1      2   6
        s2      6  10
        s3      4   8

#5 groupby-product,sensor
product  sensor
a        s1        8
         s2        8
         s3        8
b        s1        2
         s2        6
         s3        4
Name: x, dtype: int64

#6 groupby-product,sensor
                x   y
product sensor       
a       s1      7   5
        s2      5   7
        s3      8  12
b       s1      2   6
        s2      6  10
        s3      4   8

'공부한 것들.. > Pandas' 카테고리의 다른 글

Pandas 데이터 합치기  (1) 2024.09.14
Pandas 집계함수  (0) 2024.09.14
Pandas 인덱싱(Indexing) & 슬라이싱(Slicing)  (0) 2024.09.14
Pandas 결측치 이해 및 결측치 처리  (2) 2024.09.14
Pandas 데이터 파일 읽기  (1) 2024.09.14