줄리아에서 데이터프레임 그룹별로 나누고 계산하는 법
개요
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
로 가장 낮은 것을 확인할 수 있다.