ジュリアでデータフレームをグループ分けして計算する方法
概要
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
上のコードは、:unit
を基準にグループ化されたデータフレームunits
の中で、WJSN
のデータフレームの:height
の平均mean
を計算したものだ。概要で言及された通り、このStatBase.mean()
は平均を計算する関数だ。これをsum()
に変えれば合計、min()
に変えればグループ別の最小値を計算する。この例では、:unit
別に:height
の平均を計算し、쪼꼬미
グループが159.75
で一番低いことがわかる。