Pandas(판다스) groupby 사용법

Pandas는 데이터프레임을 그룹화하고 집계하는 데 사용되는 강력한 groupby 메서드를 제공한다. 이 메서드를 사용하면 데이터를 그룹화하여 그룹별로 연산을 수행하고 결과를 얻을 수 있다. 이 글에서는 Pandas의 groupby 메서드 사용법에 대해 알아본다.

groupby 메서드

groupby 메서드를 사용하려면 데이터프레임을 먼저 그룹화할 열(또는 열의 리스트)을 선택해야 한다. 그런 다음 그룹화한 데이터프레임에서 원하는 연산을 수행할 수 있다.(https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html)

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 : 그룹화할 내용으로 함수, 축, 리스트 등등이 올 수 있다.
  • axis : 그룹화를 적용할 축을 지정
  • level : 멀티 인덱스의 경우 레벨을 지정할 수 있다.
  • as_index : 그룹화할 내용을 인덱스로 할지 여부. False이면 기존 인덱스가 유지된다.
  • sort : 그룹키를 정렬할지 여부
  • group_keys : apply메서드 사용시 결과에따라 그룹화 대상인 열이 인덱스와 중복(group key)이 될 수 있다. group_keys=False로 인덱스를 기본값으로 지정할 수 있다.
  • squeeze : 결과가 1행 or 1열짜리 데이터일 경우 Series로, 1행&1열 짜리 데이터일 경우 스칼라로 출력
  • observed : Categorical로 그룹화 할 경우 Categorical 그룹퍼에 의해 관찰된 값만 표시할 지 여부
  • dropna : 결측값을 계산에서 제외할지 여부

그룹화하여 집계하기

그룹화한 그룹의 합 계산

다음은 데이터프레임을 ‘Category’ 열을 기준으로 그룹화하고, 각 그룹의 ‘Value’ 열 합계를 계산하는 예제이다.

import pandas as pd

data = {
    'Category': ['A', 'B', 'A', 'B', 'A'],
    'Value': [10, 20, 15, 25, 30]
}

df = pd.DataFrame(data)

grouped = df.groupby('Category')
sums = grouped['Value'].sum()
print(sums)
Category
A    55
B    45
Name: Value, dtype: int64

여러 열을 기준으로 그룹화하여 집계

여러 열을 기준으로 그룹화하고 집계할 수도 있다. . 예를 들어, ‘Category’와 ‘Subcategory’ 열을 기준으로 그룹화하고 합계를 계산해보겠습니다.

import pandas as pd

data = {
    'Category': ['A', 'B', 'A', 'B', 'A'],
    'Subcategory': ['X', 'X', 'Y', 'Y', 'X'],
    'Value': [10, 20, 15, 25, 30]
}

df = pd.DataFrame(data)

grouped = df.groupby(['Category', 'Subcategory'])
sums = grouped['Value'].sum()
print(sums)
Category  Subcategory
A         X              40
          Y              15
B         X              20
          Y              25
Name: Value, dtype: int64

여러 집계 함수 적용

그룹화한 데이터프레임에 여러 집계 함수를 동시에 적용할 수 있다. 다음은 평균과 합계 구하는 예제이다.

import pandas as pd

data = {
    'Category': ['A', 'B', 'A', 'B', 'A'],
    'Value': [10, 15, 20, 25, 30]
}

df = pd.DataFrame(data)

grouped = df.groupby('Category')
result = grouped['Value'].agg(['mean', 'sum'])
print(result)
          mean  sum
Category           
A         20.0   60
B         20.0   40

사용자 정의 함수 적용

때로는 기본 제공되는 집계 함수로는 원하는 결과를 얻을 수 없을 때가 있는데, 이럴 때는 사용자 정의 함수를 적용할 수 있다. 다음은 그룹화한 데이터프레임에 사용자 정의 함수를 적용하는 예제이다.

import pandas as pd

def custom_function(group):
    return group.max() - group.min()

data = {
    'Category': ['A', 'B', 'A', 'B', 'A'],
    'Value': [10, 15, 20, 25, 30]
}

df = pd.DataFrame(data)

result = grouped['Value'].agg(custom_function)
print(result)
Category
A    20
B    10
Name: Value, dtype: int64

groupby 결과를 데이터프레임으로 변환

groupby()의 결과는 groupby 객체를 return 한다.(https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html) 이를 데이터프레임으로 변환하면 다양한 연산과 시각화를 수행할 수 있다.

그룹화된 결과를 데이터프레임으로 변환하려면 reset_index() 메서드를 사용한다. reset_index()를 호출하면 인덱스가 초기화(reset)되고, 그룹화된 데이터프레임이 반환된다. 다음은 groupby() output을 데이터프레임으로 전환하는 예제이다.

import pandas as pd

data = {
    'Category': ['A', 'B', 'A', 'B', 'A'],
    'Value': [10, 20, 15, 25, 30]
}

df = pd.DataFrame(data)

grouped = df.groupby('Category')
print("grouped type : {}".format(type(grouped)))

# 그룹화 결과를 데이터프레임으로 변환
result = sums.reset_index()
print("result type : {}".format(type(result)))
print(result)
grouped type : <class 'pandas.core.groupby.generic.DataFrameGroupBy'>
result type : <class 'pandas.core.frame.DataFrame'>
  Category  Value
0        A     55
1        B     45

groupby() output 타입이 pandas.core.groupby.generic.DataFrameGroupBy 이며, reset_index() 후에 pandas.core.frame.DataFrame로 전환된것을 확인할 수 있다.

참조

답글 남기기