ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pandas] 데이터프레임 그룹화 그룹핑 그룹집계하기 :: groupby, aggregate
    직접 해보기/Python 2024. 6. 18. 20:46
    728x90
    반응형

    0️⃣  특정 칼럼을 기준으로 데이터프레임 그룹화하기  ::  groupby

    • 예시 데이터셋은 Kaggle에서 가져온 Flight Price Prediction 비행편 데이터셋인데요, 첫번째 칼럼은 쓸모없으니 삭제하고
      출발시간(departure_time) 칼럼을 기준으로 데이터를 그룹화 시켜보았습니다.
    • 다만 그룹핑시킨 결과를 출력해도 깔끔한 데이터셋이 나오는 건 아닙니다.
      이 결과 중에 무엇을 출력할지 선택해줘야 하는데요, 하나씩 테스트 해보겠습니다.
    import pandas as pd
    import numpy as np
    
    # 데이터셋 불러오기
    df = pd.read_csv('./Clean_Dataset.csv', encoding='cp949')
    df = df.drop('Unnamed: 0', axis=1)
    
    # departure_time(출발시간) 칼럼 기준으로 그룹핑
    dt_group = df.groupby(by='departure_time')


    1️⃣  그룹 개수, 그룹별 데이터 개수  ::  .ngroups .size()

    # 그룹 개수
    dt_group.ngroups
    
    # 그룹별 데이터 개수
    dt_group.size()


    2️⃣  그룹별 최솟값, 최댓값 출력하기  ::  .min() .max()

    • min, max를 사용하여 그룹별 데이터의 최솟값과 최댓값을 출력할 수 있습니다.
    • 다만 아래처럼 문자열도 알파벳 기준으로 최솟값과 최댓값을 출력해주는 모습인데요, 문자열을 제외하고 수치데이터만 보려면
      numeric_only=True 파라미터를 추가하면 됩니다.
    # 그룹별 최솟값 확인
    dt_group.min()
    
    # 그룹별 최댓값 확인 → 수치형데이터 칼럼만 
    dt_group.max(numeric_only=True)


    3️⃣  그룹별 평균값, 중간값 출력하기  ::  .mean() .median()

    • mean, median은 위의 min, max와 다르게, 문자열이 포함되어 있으니 연산할 수 없다는 에러가 나옵니다.
      따라서 numeric_only=True 파라미터를 필수로 넣어줘야 합니다.
    • 이렇게 출력한 결과에서 특정 칼럼만 추출해보고 싶다면, 데이터프레임 칼럼 뽑듯이 대괄호 2개 안에 칼럼명을 넣으면 됩니다.
    # 그룹별 평균값 확인
    dt_group.mean(numeric_only=True)
    
    # 그룹별 평균값 확인 → 필요한 칼럼만 추출
    dt_group.mean(numeric_only=True)[['price']]

     

     


    4️⃣  칼럼 여러개로 그룹화하기 - 멀티인덱싱 (multi-indexing)

    • 칼럼 여러개를 기준으로 그룹화 시키고 싶다면, groupby를 쓸 때 아래처럼 리스트로 칼럼을 넣어주면 됩니다.
      df.groupby(by=['칼럼명1', '칼럼명2'])
    • 평균값을 출력해보면, 그룹화 기준이 된 원데이터의 칼럼 2개가 인덱스 2개로 들어가 있습니다. (멀티인덱싱)
    # 칼럼 여러개로 그룹핑하기 → 멀티인덱싱
    airline_dt_group = df.groupby(by=['airline', 'departure_time'])
    
    # 멀티 그룹별 평균값 확인
    airline_dt_group.mean(numeric_only=True)

     

     

    • 인덱스가 2개 이상이면 출력한 결과도 많아집니다. 이중에서 원하는 인덱스만 선택해서 보고싶다면
      일반적인 데이터프레임에서 행 뽑듯이 loc메소드를 써주면 됩니다.
    • 만약 멀티인덱스로 행을 선택하고 싶다면, 아래처럼 튜플형식으로 넣어줘야 합니다.
    # 원하는 인덱스(행)만 출력하기 (1) - 1번째 인덱스 선택
    airline_dt_group.mean(numeric_only=True).loc[['Air_India']]
    
    # 원하는 인덱스(행)만 출력하기 (2) - 튜플형식으로 1,2번째 인덱스 함께 선택
    airline_dt_group.mean(numeric_only=True).loc[[('Air_India', 'Morning')]]


    5️⃣  그룹화 결과를 여러가지 집계값으로 한번에 보기  ::  aggregate

    • 최솟값, 최댓값, 평균값.. 하나씩 뽑기보다, 보고서 작성 등을 위해 한번에 볼 수 있도록 집계해야 할때,
      aggregate 메소드를 유용하게 활용할 수 있습니다.
    • 위에서 멀티인덱싱 해놓았던 결과를 가지고 aggregate 테스트를 해보려고 하는데요, 살짝 귀찮은 과정이 필요합니다.
      aggregate는 numeric_only 파라미터가 없기 때문에 그냥 쓰면 에러가 날 수 있습니다.
      아래와 같이 그룹화한 다음 수치형 칼럼만 뽑아놓고, 그 결과에서 aggregate를 써줘야 합니다.
    # 칼럼 여러개로 그룹핑 → 수치형데이터 칼럼만 추출해놓기
    airline_dt_group = df.groupby(by=['airline', 'departure_time'])[['duration', 'price']]
    
    # 최솟값, 최댓값, 평균값 한번에 집계하기
    airline_dt_group.aggregate(['min', 'max', 'mean'])


     

     

    728x90
    반응형