본문 바로가기

Pandas/응용

판다스 - groupby : 그룹 객체에서 컬럼간 연산

반응형

타이타닉 데이터프레임을 

 

pclass와 성별 컬럼으로 그룹화

 

 

 

1. 하나의 컬럼

그룹별 나이를, 그룹별 나이의 합으로 나누고 싶다면?

 

방법1. apply와 lambda 함수 이용

 

 

멀티인덱스의 시리즈로 나왔다.

 

보기엔 편할 수 있으나 굳이 인덱스까지 필요없다면

 

 

 

 

 

방법2. 컬럼명.apply 또는 컬럼명.transform 이용

 

 

좌,우 두 개의 결과는 동일하다.

 

 

 

 

apply와 transform에 대한 내용은 아래 포스팅 참조

 

 

https://steadiness-193.tistory.com/42

 

판다스 - groupby : apply와 transform (차이)

[개별 원소] apply transform [공통] 컬럼명을 메서드 밖에서 명시하면 결과는 같게 나온다. [차이1] 컬럼명을 메서드 안에서 명시하면 그룹별 시리즈 리턴 에러 [차이2] 컬럼명을 메서드 안과 밖에 모�

steadiness-193.tistory.com

 

 

 

 

 

2. 두개의 컬럼

그룹별 나이를 그룹별 요금으로 나누려면?

 

 

SeriesGroupBy끼리는 나눌 수 없음

 

 

 

 

transform도 에러 발생

 

 

 

 

 

 

 

방법1. apply 이용

 

 

groupby에서 만능인 apply를 이용하면 원하는 값을 얻을 수 있다.

 

다만 멀티인덱스의 시리즈로 출력되니

 

이후 전처리가 다소 귀찮게 느껴진다.

 

 

 

 

 

 

 

 

 

방법2. 함수 정의 + apply

 

 

간단하지만 다재다능한 함수를 사용하자.

 

 

 

위 함수는 그룹별 나이와 그룹별 요금을 나눠서

 

div라는 새로운 컬럼을 추가해 데이터프레임을 반환한다.

 

 

 

 

결과를 보면

 

 

그룹별로 연산된 div 컬럼이 생성된 것을 볼 수 있다.

 

 

이제 div컬럼만 선택하면 원하는 값만 가져올 수 있는 것이다.

 

 

 

사실 두개의 컬럼 자체만을 이용한다면 그룹의 기능은 없다.

 

 

 

그냥 데이터프레임의 컬럼간 나누기를 한 것과 다르지 않기 때문이다.

 

 

 

 

 

 

3. 그룹객체와 apply의 진가

그룹별 나이를 그룹별 나이의 합으로 나누려면?

그룹별 나이를 그룹별 요금의 합으로 나누려면?

 

위 예시는 임의로 만든 것이다.

 

 

 

나이를, 그 그룹별 나이의 합으로 나누었다.

 

 

 

 

나이를, 그 그룹별 요금의 합으로 나누었다.

 

 

 

 

 

원본데이터프레임이 아니라 함수가 적용된 시리즈만 받아오려면

 

위 1번 예시의 lambda를 이용하거나

 

 

 

 

 

 

 

return 할때 컬럼명을 적어서 가져온다.

 

 

 

 

 

 

반응형