줄리아에서 데이터프레임 그룹별로 나누고 계산하는 법

줄리아에서 데이터프레임 그룹별로 나누고 계산하는 법

How to Divide Dataframe by Group and Calculate in julia

개요

groupby()를 사용해 그룹별로 나누고 combine()을 사용해 계산하면 된다.1

groupby(df, :colname)

  • :colname을 기준으로 GroupedDataFrame를 리턴한다.

combine(gdf, :colname => fun)

  • gdf는 그룹별로 나뉜 GroupedDataFrame다.
  • :colname => fun은 계산할 값이 있는 열의 이름인 심볼 :colname과 계산할 함수 fun페어다.

코드

using DataFrames
using StatsBase

WJSN = DataFrame(
    member = ["다영","다원","루다","소정","수빈","연정","주연","지연","진숙","현정"],
    birth = [99,97,97,95,96,99,98,95,99,94],
    height = [161,167,157,166,159,165,172,163,162,165],
    unit = ["쪼꼬미","메보즈","쪼꼬미","더블랙","쪼꼬미","메보즈","더블랙","더블랙","쪼꼬미","더블랙"]
)
sort!(WJSN, :birth)

unique(WJSN, :unit)

units = groupby(WJSN, :unit)
units[1]
units[2]
units[3]

combine(units, :height => mean)

위의 예제 코드를 실행해보고 그 결과를 확인해보자.

julia> WJSN
10×4 DataFrame
 Row │ member  birth  height  unit   
     │ String  Int64  Int64   String 
─────┼───────────────────────────────
   1 │ 현정       94     165  더블랙
   2 │ 소정       95     166  더블랙
   3 │ 지연       95     163  더블랙
   4 │ 수빈       96     159  쪼꼬미
   5 │ 다원       97     167  메보즈
   6 │ 루다       97     157  쪼꼬미
   7 │ 주연       98     172  더블랙
   8 │ 다영       99     161  쪼꼬미
   9 │ 연정       99     165  메보즈
  10 │ 진숙       99     162  쪼꼬미

WJSN 데이터프레임은 위와 같다.

그룹별로 나누기 groupby()

julia> units = groupby(WJSN, :unit)
GroupedDataFrame with 3 groups based on key: unit
First Group (4 rows): unit = "더블랙"
 Row │ member  birth  height  unit   
     │ String  Int64  Int64   String 
─────┼───────────────────────────────
   1 │ 현정       94     165  더블랙
   2 │ 소정       95     166  더블랙
   3 │ 지연       95     163  더블랙
   4 │ 주연       98     172  더블랙
⋮
Last Group (2 rows): unit = "메보즈"
 Row │ member  birth  height  unit   
     │ String  Int64  Int64   String 
─────┼───────────────────────────────
   1 │ 다원       97     167  메보즈
   2 │ 연정       99     165  메보즈

:unit 열을 기준으로 데이터프레임이 세 개의 그룹으로 나뉘었다.

julia> units[1]
4×4 SubDataFrame
 Row │ member  birth  height  unit   
     │ String  Int64  Int64   String 
─────┼───────────────────────────────
   1 │ 현정       94     165  더블랙
   2 │ 소정       95     166  더블랙
   3 │ 지연       95     163  더블랙
   4 │ 주연       98     172  더블랙

julia> units[2]
4×4 SubDataFrame
 Row │ member  birth  height  unit   
     │ String  Int64  Int64   String 
─────┼───────────────────────────────
   1 │ 수빈       96     159  쪼꼬미
   2 │ 루다       97     157  쪼꼬미
   3 │ 다영       99     161  쪼꼬미
   4 │ 진숙       99     162  쪼꼬미

julia> units[3]
2×4 SubDataFrame
 Row │ member  birth  height  unit   
     │ String  Int64  Int64   String 
─────┼───────────────────────────────
   1 │ 다원       97     167  메보즈
   2 │ 연정       99     165  메보즈

위와 같이 GroupedDataFrame에 인덱싱을 함으로써 나뉘어진 데이터프레임에 접근할 수 있다.

그룹별로 계산하기 combine()

julia> combine(units, :height => mean)
3×2 DataFrame
 Row │ unit    height_mean 
     │ String  Float64     
─────┼─────────────────────
   1 │ 더블랙       166.5
   2 │ 쪼꼬미       159.75
   3 │ 메보즈       166.0

위 코드는 WJSN 데이터프레임이 :unit을 기준으로 그룹화된 데이터프레임 units에서 :height의 평균 mean을 계산한 것이다. 개요에서 언급했듯 이 StatBase.mean()은 평균을 구하는 함수다. 이것을 sum()으로 바꾸면 합계, min()으로 바꾸면 그룹별로 최소값을 계산한다. 이 예제에서는 :unit별로 :height의 평균을 계산했고, 쪼꼬미 그룹이 159.75로 가장 낮은 것을 확인할 수 있다.


  1. https://stackoverflow.com/questions/64226866/groupby-with-sum-on-julia-dataframe ↩︎

댓글