※ 본 내용에서 사용하는 production_monthly_1990.csv 파일은 별도로 다운로드 받아야 한다. ※ production_monthly_1990.csv 다운받기 [클릭]
개요
Pandas 객체의 특정 변수를 요약하고자 하는 경우 .sum()이나 .mean() 같은 메서드로 여러 요약 수치를 산출한다. 여기서 더 나아가 다른 변수를 기준으로 이런 요약 수치를 산출하는 작업이 필요할 수 있다. 예를 들어 월별 총 매출, 사용자별 구매상품 종류수 그리고 일별 최저기온 같은 수치가 있을 수 있다. 이러한 수치를 산출하고자 할 때는 월별로 데이터를 별도로 필터링할 수 있지만 이런 작업을 할 경우 중복되는 코드가 많아지거나 반복문을 써야하는 불편함이 있을 수 있다. 이 불편함을 해소해주는 메서드 중 하나가 .groupby() 메서드이다. 이제 groupby() 메서드에 대해 알아보도록 하자.
ls_mean = [] for n in range(1990, 1994): ls_mean = ls_mean + [df.loc[df["year"] == n, "volumn"].mean()] ls_mean ## [1265.9566666666667, 1316.8275, 1231.8875, 1255.1999999999998]
기본형
.groupby() 메서드는 메서드 내부에 데이터프레임의 특정 변수를 기준 변수로 해서 해당 변수를 기준으로 다른 변수의 요약 연산을 실시할 수 있도록 지원하는 메서드이다.
기준 변수의 경우 그 개수가 하나일 경우 단순 문자열로 입력하면 되나, 두 개 이상인 경우 변수명을 리스트로 감싼다. 그리고 요약 연산의 대상이 되는 변수는 메서드 뒤에 대괄호를 사용하여 명시하며 기준 변수와 같이 두 개 이상의 변수를 지정하는 경우 변수명을 리스트로 감싸야 한다. 마지막으로 연산 규칙 또는 알고리즘은 대괄호 뒤에 적절한 메서드(.mean(), .agg() 등)를 사용하여 지정하며 Pandas 시리즈 객체에서 지원하는 메서드를 사용할 수 있다.
이제 기준 변수와 대상 변수가 각각 1개 할당된 형태의 기본형 코드로 .groupby() 메서드를 사용해보자. 연도(year)별 생산량(volumn)의 평균(mean)을 구하기 위한 코드는 다음과 같다.
이번에는 .groupby() 메서드에 2개의 기준 변수를 넣어보자. 데이터가 연도별 월별 데이터이기 때문에 기준변수에 연도와 월 변수를 넣는 것은 의미가 없어 2000년도 부터 최근까지 데이터를 1, 나머지를 0으로 하는 “is_2k” 변수를 추가로 만들고 진행하도록 한다.
1 2
df["is_2k"] = (df["year"] >= 2000) + 0 df.head(2)
year
month
volumn
is_2k
0
1990
1
1199.87
0
1
1990
2
1214.54
0
기준 변수에 두 개 이상의 변수를 지정할 경우 리스트 객체로 만들어줘야 하기에 대괄호로 기준 변수명을 다음과 같이 묶어준다.
한 줄 정도의 간단한 일회성 연산규칙을 사용하고자 할 때는 이렇게 람다 함수를 사용하는 것이 좋으며, 사용자 정의 함수를 사용하는 것보다 코드가 간결해질 수 있다. 하지만 여러줄의 복잡한 연산규칙을 사용하고자 할 때는 사용자 정의 함수를 권장한다.
.agg() + dictionary
.agg() 메서드에 딕셔너리를 사용하면 대상 변수 각각 대해 다양한 연산규칙을 적용할 수 있다. 이 방법을 사용하게 되면 2개 이상의 객체를 .groupby() 메서드를 사용해서 만들고 각 객체를 하나로 join하는 과정을 간단하고 쉽게 처리할 수 있다. 일단 기존의 데이터에는 연산 대상으로 지정할 변수가 “volumn” 하나 밖에 없기 때문에 “volumn” 변수를 100으로 나눈 몫을 기반으로 “v2” 변수를 새로 만들어주고 진행하도록 한다. 그럼 다음과 같이 코드를 작성해보자.