[pandas] 그룹(groupby)연산과 집계

Bpius·2023년 5월 27일
0
post-thumbnail

분리-적용-결합

그룹 연산은 '분리-적용-결합'이라는 메커니즘을 따른다. 그룹 연산을 할 때 DataFrame은 하나 이상의 키를 기준으로 '분리' 작업을 한다. 분리를 할 때에는 로우나 컬럼으로 분리를 할 수 있다. 그렇게 분리한 데이터 값을 함수를 적용시켜서 새로운 값을 만들고 다시 DataFrame으로 합치는 작업을 진행을 하게 된다. 사실 새로운 값은 어떤 형식으로 합쳤는가에 따라서 DataFrame이 될 수도 Series가 될 수도 있다.
이렇게 그룹 연산을 할 수 있도록 pandas는 groupby 메서드를 지원한다.

groupby 연산

seaborn에서 재공하는 'iris' 데이터셋으로 그룹 연산을 진행해 보도록 하자.

groupby 메서드는 GroupBy 객체를 반환하는데 그룹으로 분리되어 아직 아무런 연산이 되지 않은 값을 지니고 있다.

species를 키로(로우, 인덱스) 그룹으로 묶은 다음 연산이 가능한 컬럼들에 함수를 적용시켜보자.
평균값이나 중간 값등을 계산할 수 있다.

그룹으로 묶은 데이터의 길이(사이즈)를 확인할 수도 있다. size()는 그룹의 크기를 담고있는 Series값을 반환해준다.

groupby는 DataFrame형식의 groupby 객체를 반환하기에 DataFrame처럼 반복가능한 객체로써 반복문을 사용하여 연산을 할 수 있다. species를 기준으로 그룹화 했기 때문에 species의 종류 3번 만큼의 반복문 사용이 가능하다.

groupby 객체는 키와 그 키가 가지고 있는 데이터를 반환한다.

iris 데이터 셋은 species별로 50개씩의 데이터를 제공하는데 그 길이를 확인해 볼 수 있다.

iris 데이터셋의 데이터 타입은 object와 float로 이루어져 있는데, 이 데이터 형식으로 묶을 수 있다. 지금까지는 species 축이 아래로 향했다면 데이터 타입은 옆으로 향한다는 것을 주의하자.
축의 방향을 axis=1로 설정하면 2가지의 데이터 타입으로 그룹화되어 묶이는 것을 볼 수 있다.

groupby 메서드에는 축의 길이와 같은 경우 리스트나 배열로 색인하여 묶을 수 있다. species의 축의 길이는 150이므로 길이가 150인 리스트나 배열로 그룹화를 할 수 있다.
먼저 아래와 같이 setosa=0, versicolor=1, virginica=2로 매칭하기 위해 길이가 150인 배열을 가져온다.

이것을 그룹화해서 평균과 반복문을 진행하면 그룹화가 이루어진 것을 볼 수 있다. 그룹은 0, 1, 2로 이루어졌기에 마찬가지로 3번의 반복문을 진행한다. 값은 끝의 5개를 보자.

길이가 같은 경우 키 값을 여러 개를 던져도 된다. 키 값들로 그룹화 된 것을 볼 수 있다.

groupby 집계

집계는 위의 같이 mean()(평균값)등을 이용하여 스칼라값을 구하는 것을 말한다.
seaborn에서 제공하는 tips 데이터셋으로 확인해 보자.

agg

agg 메서드에는 직접 작성한 함수를 넣거나, 지원하는 함수명을 주면 된다.

함수는 여러개를 넘길 수 있다.

그리고 컬럼별로 적용시킬 함수를 다르게 적용하려면 딕셔너리 형태로 컬럼과 적용시키려는 함수를 매칭하면 된다.

그룹으로 묶은 컬럼(키)이 인덱스명이 되는데, 그룹으로만 연산을 진행하고 키를 컬럼으로 계속 유지 하려면(컬럼으로 전환하려면) reset_index를 사용하면 된다.

위의 reset_index의 역할을 함수 안에서 바로 적용이 가능하다.(as_index=False)

Apply

apply는 agg와 비슷하게 작동하지만 다른 점이 몇가지 있는데, agg는 여러개의 함수를 적용시킬 수 있지만 apply는 여러개의 함수를 적용시키지 못한다.
하지만 apply는 Series의 연산을 지원하는 반면, agg는 Series의 연산을 이제 지원하지 않는다. Series의 연산을 통해 스칼라 값을 구하려면 apply 메서드를 쓰면 된다.

agg는 전체 DataFrame의 연산을 지원한다.

describe

그리고 groupby의 describe를 통해 그룹화한 GroupBy 객체의 describe를 확인할 수 있다.

fillna

결측치 값에 데이터값을 채워넣을 수 있다.

profile
데이터 굽는 타자기

0개의 댓글