IT Study/코딩테스트 by Python

[Python] groupby, aggregate, pivot_table

짹짹체유 2023. 11. 17. 20:52

 

파이썬에서 데이터프레임을 다루는 함수들 중

groupby, aggregate, pivot_table을 복습하고 예시문제들로 활용법을 연습해보자.

 

Groupby

groupby는 데이터를 그룹화하는 함수이다.

df.groupby('그룹화할 컬럼')
  • 옵션
    • axis: 그룹화 적용 축
    • level: 멀티 인덱스가 있을 경우의 레벨 지정
    • dropna: 결측값 계산에서의 제외 여부
df = pd.DataFrame({
    'key': ['A', 'B', 'C', 'A', 'B', 'C'],
    'data1': [0, 1, 2, 3, 4, 5],
    'data2': [4, 4, 6, 0, 6, 1]
})
  • key를 기준으로 그룹화하고 그룹화는 평균값으로 계산
df.groupby('key').mean()

 


Aggregate

aggregate는 연산을 적용하는 함수이다.

min(), max(), sum(), count() 등의 함수들이 있다.

groupby 함수에서만 적용되는 것은 아니며 groupby 함수와 함께 사용될 경우에는 그룹화한 값에 연산을 적용하는 함수로 쓰인다.

aggregate(['집계함수1', '집계함수2', ... ])

 

  • key를 그룹별로 합계와 평균값 계산하기
df.groupby('key').aggregate(['sum', 'mean'])

 

  • 여러 컬럼에 다른 계산식 적용하기
aggregate({'컬럼명1' : '집계함수1', '컬럼명2' : '집계함수2' ... })
  • data1은 최소값을, data2는 합계로 그룹화하기
df.groupby('key').aggregate({ 'data1' : min, 'data2' : sum })

 

 


Groupby 응용

groupby함수를 filter함수와 apply함수 등 여러 함수들과 함께 사용해볼 수 있다.

 

  • data2 평균이 2이 넘는 데이터만 출력
df.groupby('key').filter(lambda x: x['data2'].mean() > 3)
  • 그룹별 data1과 data2 변수의 최댓값에서 최솟값을 뺀 값 출력
df.groupby('key').apply(lambda x: x.max() - x.min())
## 내가 했던 코드 -> 오류
df.groupby('key').apply((lambda x, y: x - y)(df.max(), df.min())

 

 

 

groupby로 그룹화를 한 후 get_group 함수를 통해 특정 그룹의 값만을 가져올 수 있다.

df.groupby('key').get_group('B')

 

 


Pivot_table

pivot_table함수는 함수명 그대로 피벗테이블을 생성하는 함수이다.

df.pivot_table(index="행", columns="열", values="조회값", aggfunc = "적용함수")
  • 옵션
    • index: 테이블의 행으로 들어갈 데이터프레임의 열
    • columns: 테이블의 열로 들어갈 데이터프레임의 열
    • values: 피벗테이블에서 각 그룹별 조회할 값의 데이터프레임의 열
    • fill_value: 값이 존재하지 않는 그룹에 채울 값
    • aggfunc: 그룹 별로 값을 조회할 함수

예제

data = {'class' : [1, 2, 2, 1, 1, 2, 2, 1],
	'sex' : ['남', '여', '남', '여', '남', '남', '여', '여'],
        'major' : ['문과', '이과', '이과', '문과', '문과', '이과', '문과', '이과'],
     	'korean' : [90, 70, 85, 95, 100, 65, 95, 92],
        'math' : [88, 96, 92, 84, 72, 92, 100, 88]
        }
df = pd.DataFrame(data)

 

  • 반의 전공별 국어 성적의 평균을 구하시오
pd.pivot_table(df, index='class', values='korean', 
		columns='major', aggfunc=np.mean)

 

  • 반마다 성별에 따라 국어와 수학 성적을 전공별로 평균을 구하시오
pd.pivot_table(df, index=['class', 'sex'], values=['korean', 'math'], 
                columns='major', aggfunc=np.mean)

 

 

반응형