logo

ジュリアでデータフレームをグループ分けして計算する方法 📂ジュリア

ジュリアでデータフレームをグループ分けして計算する方法

概要

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で一番低いことがわかる。