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
로 전환된것을 확인할 수 있다.