-
[python] [pandas] groupbyData miner 2020. 4. 1. 21:50728x90
dataframe의 정보들을 그룹핑하여 유의미한 통계량을 내는데 있어서 자주 쓰는 함수가 groupby다. 컬럼 혹은 인덱스에서 구조화되지 않은 경우, dataframe.groupby(['컬럼명'])으로 그룹지은 후, 사용자의 의도에 맞는 함수를 적용시켜 이것에 대한 세부 통계를 구한다.
실제 분석에 사용한 데이터를 가지고 이해해보자. game_id(게임 대전 고유 번호), winner, time, player, species, event, event_contents 로 칼럼으로 구성된 게임 데이터셋 train이 있다고 가정하자.
위의 데이터셋에서 나는 특정 게임 대전 마다(game_id) event에서 각 세부 게임 로그 활동이 얼마만큼 일어나는지를 알고 싶었다. 즉, game id가 0일 때, Camera, Selection, Ability가 각각 몇 번 일어나는지가 궁금했던 것이다. 이 경우, 위의 groupby함수를 사용하면 쉽게 얻을 수 있다.
train.groupby(['game_id','event']).size()
이 때, groupby만을 적용한 값은 객체값으로 그룹 연산을 위해 필요한 모든 정보들을 가지고 있어, 내장된 연산(mean, sum, count...)등 외에도 사용자가 커스터마이징한 함수들을 적용할 수 있게 해준다. agg, aggregate 메서드에 자신의 함수를 입력하면 된다.
def peak(arr): return arr.max()-arr.min() train.groupby(['game_id'])['event_count'].agg(peak)
만약, 그룹별 연산을 기존 데이터 프레임에 새로운 컬럼값으로 붙이기 위해서는 transform이라는 함수를 추가적으로 이용해야 한다. 아래의 코드는 각 game_id마다 event의 종류별 빈도수를 train['event_count']에 넣었다. 아래의 winner의 경우, 등장하는 빈도를 구하기 위해서 다른 컬럼의 명을 사용한 것이다. 만약 다른 컬럼의 통계량을 사용하여 다른 값을 도출하고 싶다면 그 컬럼명을 사용하면 된다. 다시 말해, game_id마다 event의 여러 하위 명(Ability, AddToControlGroup ...)이 각각 어느정도 발생했는지를 알아야 했기에 단순히 다른 컬럼('winner')을 사용하였다.
train['event_count'] = train.groupby(['game_id','event']).winner.transform('count')
위에서는 내장된 함수인 count를 transform('count')로 사용하였지만, transform(lambda x: x.max() - x.min())와 같은 형태로도 사용할 수 있다.
'Data miner' 카테고리의 다른 글
[Pioneer_Hackathon] 참가 후기 (0) 2020.04.15 [python] [pandas] 객체에 함수 적용하기. apply (0) 2020.04.03 #이진탐색 #행렬이라면? (0) 2019.10.02 [선형탐색/이진탐색] 탐색 기법 비교 (0) 2019.09.30 #정렬 #문자열정렬 #튜플활용 (0) 2019.09.26