Data Engineering/Python

[Python] DataFrame의 groupby에 매소드 적용 (agg 활용)

YSY^ 2022. 7. 2. 23:03

DataFrame의 groupby에 매소드 적용

python의 Groupby 함수를 활용하는 다양한 방법을 알아보겠습니다.

데이터는 아래 kaggle 링크의 event.csv 데이터를 활용하였습니다.

https://www.kaggle.com/datasets/mkechinov/ecommerce-events-history-in-electronics-store

 

데이터 불러오기

import pandas as pd
df = pd.read_csv("events.csv")
df["event_time"] = pd.to_datetime(df["event_time"])
df["date"] = df["event_time"].dt.strftime('%Y-%m-%d')

groupby에 함수를 적용하는 방법

1. groupby에 메소드를 바로 적용하는 방법

df.groupby(["brand"])["user_id"].count().reset_index()

2. agg 함수를 활용해서 메소드를 적용시키는 방법이 있습니다. ->  여러가지 method 를 적용가능

df.groupby(["brand"]).agg({"user_id" : "count"}).reset_index()

이번 포스팅에서는 주로 2번 방식을 활용해서 다양하게 groupby를 활용하는 방법을 소개하겠습니다.

참고로 메소드로 활용 가능한 함수는 아래 링크에서 활용 가능합니다.

https://pandas.pydata.org/docs/reference/groupby.html

 

GroupBy — pandas 1.4.3 documentation

previous pandas.api.indexers.VariableOffsetWindowIndexer.get_window_bounds

pandas.pydata.org

여러개의 컬럼을 기준으로 집계하기

event_type와 brand별로 개수를 세어보겠습니다.

df.groupby(["event_type", "brand"])["user_id"].count().reset_index()

 

여러 컬럼에 다양한 메소드를 적용

event_type가 "view"인 case를 대상으로 user_id별로 어떤 brand를 봤는지(unique), 처음 유입된 날짜(first)는 언제인지를 집계해보겠습니다.

df[df["event_type"] == "view"].groupby(["user_id"]).agg({"brand" : "unique", "date" : "first"}).reset_index()

 

하나의 컬럼에 여러 메소드를 적용

event_type가 "view"인 case를 대상으로 user_id별로 price컬럼을 'count', 'mean', 'min', 'max' 메소드로 집계해보겠습니다.

df[df["event_type"] == "view"].groupby(["user_id"]).agg({"price" : ['count', 'mean', 'min', 'max']}).reset_index()

 

튜플을 활용하면 컬럼의 이름도 재지정할 수 있습니다

df[df["event_type"] == "view"].groupby(["user_id"]).agg({"price" : [('횟수', 'count'), ('평균', 'mean'), ('최소값', 'min'), ('최대값', 'max')]}).reset_index()

 

메소드 대신에 사용자 정의 함수를 적용

event_type가 "view"인 case를 대상으로 user_id별로 첫 유입 날짜와 마지막 유입날짜의 사이를 집계하는 사용자 정의 함수를 및 price의 Interquartile range(IQR)을 구하는 사용자 정의 함수를 적용해보겠습니다.

def date_interval(event_time):
    first_date = min(event_time)
    last_date = max(event_time)
    
    date_diff = (last_date - first_date).days
    
    return date_diff
  
 def iqr(x):
    q3, q1 = np.percentile(x, [75, 25])
    iqr = q3 - q1
    return iqr
   
df[df["event_type"] == "view"].groupby(["user_id"]).agg({"event_time" : date_interval, "price" : iqr}).reset_index()

728x90
반응형